Приводим данные из csv файла в бинарный формат - C#

Узнай цену своей работы

Формулировка задачи:

Есть необходимость часть данных из файла csv перегнать в формат bin. Вот фрагмент тестового кода:
Листинг программы
  1. using (var memory = new MemoryStream())
  2. {
  3. using (var reader = new StreamReader(Application.StartupPath + "//test1.csv"))
  4. {
  5. while (reader.EndOfStream == false)
  6. {
  7. string[] data = reader.ReadLine().Split(';');
  8. UInt32 time = Convert.ToUInt32(data[3]);
  9. double price = Convert.ToDouble(data[4].Replace(".", ","));
  10. UInt32 vol = Convert.ToUInt32(data[5]);
  11.  
  12. byte[] byteArray = new byte[4];
  13. byte[] byteArray1 = new byte[8];
  14. byte[] byteArray2 = new byte[4];
  15.  
  16. byteArray = BitConverter.GetBytes(time);
  17. byteArray1 = BitConverter.GetBytes(price);
  18. byteArray2 = BitConverter.GetBytes(vol);
  19. memory.Write(byteArray, 0, 4);
  20. memory.Write(byteArray1, 0, 8);
  21. memory.Write(byteArray2, 0, 4);
  22.  
  23. }
  24.  
  25. }
  26. using (BinaryWriter s = new BinaryWriter(new FileStream(Application.StartupPath + "//testbin.bin", FileMode.Create)))
  27. {
  28.  
  29. s.Write(memory.GetBuffer());
  30.  
  31. }
  32.  
  33. }
Что можно сделать,чтобы все работало быстрее? Файлов будет несколько тысяч.Данные меняться не будут. Может использовать "как-нибудь" MMF файлы? Можно ускорить процесс чтения csv если прочитать reader.ReadToEnd и уже потом загнать все это в массив через Split? Или вообще не париться с бинарными файлами и все загнать в БД...например SQLite,но в БД уж большие издержки на INSERT возникают...да и потом считывать надо будет...

Решение задачи: «Приводим данные из csv файла в бинарный формат»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Globalization;
  5. using System.IO;
  6. using System.Text;
  7.  
  8. namespace ConsoleApplication212
  9. {
  10.     class Program
  11.     {
  12.         static void Main()
  13.         {
  14.             Console.WriteLine("Init....");
  15.  
  16.             //создаем временный CSV и бинарный файл
  17.             var rnd = new Random();
  18.             using (var sw = new StreamWriter("c:\\temp.csv", false, Encoding.Default))
  19.             using (var fs = new FileStream("c:\\temp.bin", FileMode.Create))
  20.             using (var bw = new BinaryWriter(fs, Encoding.Default))
  21.             for (int i = 0; i < 10000000; i++)
  22.             {
  23.                 for (int j = 0; j < 3; j++)
  24.                     sw.Write("{0};", (uint) rnd.Next());
  25.  
  26.                 bw.Write((uint)rnd.Next());
  27.                 bw.Write((double)rnd.NextDouble());
  28.                 bw.Write((UInt64)rnd.Next());
  29.  
  30.                 sw.WriteLine();
  31.             }
  32.  
  33.             //подготавливаем список
  34.             var list = new List<Tick>(10000000);
  35.  
  36.             //читаем CSV файл
  37.             var watch = Stopwatch.StartNew();
  38.             using (var sr = new StreamReader("c:\\temp.csv", Encoding.Default))
  39.             while(!sr.EndOfStream)
  40.             {
  41.                 var line = sr.ReadLine();
  42.                 var parts = line.Split(';');
  43.                 var item = new Tick();
  44.                 item.time = UInt32.Parse(parts[0]);
  45.                 item.price = UInt32.Parse(parts[1], CultureInfo.InvariantCulture);
  46.                 item.vol = UInt64.Parse(parts[2]);
  47.                 list.Add(item);
  48.             }
  49.             Console.WriteLine("Reading of CSV file: {0} ms", watch.ElapsedMilliseconds);
  50.  
  51.             //подготавливаем список
  52.             list.Clear();
  53.  
  54.             //читаем BIN
  55.             watch = Stopwatch.StartNew();
  56.             using (var fs = new FileStream("c:\\temp.bin", FileMode.Open))
  57.             using (var br = new BinaryReader(fs, Encoding.Default))
  58.             for (long i = fs.Length / (4 + 8 + 8); i > 0; i-- )
  59.             {
  60.                 var item = new Tick();
  61.                 item.time = br.ReadUInt32();
  62.                 item.price = br.ReadDouble();
  63.                 item.vol = br.ReadUInt64();
  64.                 list.Add(item);
  65.             }
  66.             Console.WriteLine("Reading of BIN file: {0} ms", watch.ElapsedMilliseconds);
  67.  
  68.             Console.ReadLine();
  69.         }
  70.     }
  71.  
  72.     struct Tick
  73.     {
  74.         public UInt32 time;
  75.         public double price;
  76.         public UInt64 vol;
  77.     }
  78. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы