Приводим данные из csv файла в бинарный формат - C#
Формулировка задачи:
Есть необходимость часть данных из файла csv перегнать в формат bin.
Вот фрагмент тестового кода:
Что можно сделать,чтобы все работало быстрее?
Файлов будет несколько тысяч.Данные меняться не будут.
Может использовать "как-нибудь" MMF файлы?
Можно ускорить процесс чтения csv если прочитать reader.ReadToEnd и уже потом загнать все это в массив через Split?
Или вообще не париться с бинарными файлами и все загнать в БД...например SQLite,но в БД уж большие издержки на INSERT возникают...да и потом считывать надо будет...
Листинг программы
- using (var memory = new MemoryStream())
- {
- using (var reader = new StreamReader(Application.StartupPath + "//test1.csv"))
- {
- while (reader.EndOfStream == false)
- {
- string[] data = reader.ReadLine().Split(';');
- UInt32 time = Convert.ToUInt32(data[3]);
- double price = Convert.ToDouble(data[4].Replace(".", ","));
- UInt32 vol = Convert.ToUInt32(data[5]);
- byte[] byteArray = new byte[4];
- byte[] byteArray1 = new byte[8];
- byte[] byteArray2 = new byte[4];
- byteArray = BitConverter.GetBytes(time);
- byteArray1 = BitConverter.GetBytes(price);
- byteArray2 = BitConverter.GetBytes(vol);
- memory.Write(byteArray, 0, 4);
- memory.Write(byteArray1, 0, 8);
- memory.Write(byteArray2, 0, 4);
- }
- }
- using (BinaryWriter s = new BinaryWriter(new FileStream(Application.StartupPath + "//testbin.bin", FileMode.Create)))
- {
- s.Write(memory.GetBuffer());
- }
- }
Решение задачи: «Приводим данные из csv файла в бинарный формат»
textual
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Globalization;
- using System.IO;
- using System.Text;
- namespace ConsoleApplication212
- {
- class Program
- {
- static void Main()
- {
- Console.WriteLine("Init....");
- //создаем временный CSV и бинарный файл
- var rnd = new Random();
- using (var sw = new StreamWriter("c:\\temp.csv", false, Encoding.Default))
- using (var fs = new FileStream("c:\\temp.bin", FileMode.Create))
- using (var bw = new BinaryWriter(fs, Encoding.Default))
- for (int i = 0; i < 10000000; i++)
- {
- for (int j = 0; j < 3; j++)
- sw.Write("{0};", (uint) rnd.Next());
- bw.Write((uint)rnd.Next());
- bw.Write((double)rnd.NextDouble());
- bw.Write((UInt64)rnd.Next());
- sw.WriteLine();
- }
- //подготавливаем список
- var list = new List<Tick>(10000000);
- //читаем CSV файл
- var watch = Stopwatch.StartNew();
- using (var sr = new StreamReader("c:\\temp.csv", Encoding.Default))
- while(!sr.EndOfStream)
- {
- var line = sr.ReadLine();
- var parts = line.Split(';');
- var item = new Tick();
- item.time = UInt32.Parse(parts[0]);
- item.price = UInt32.Parse(parts[1], CultureInfo.InvariantCulture);
- item.vol = UInt64.Parse(parts[2]);
- list.Add(item);
- }
- Console.WriteLine("Reading of CSV file: {0} ms", watch.ElapsedMilliseconds);
- //подготавливаем список
- list.Clear();
- //читаем BIN
- watch = Stopwatch.StartNew();
- using (var fs = new FileStream("c:\\temp.bin", FileMode.Open))
- using (var br = new BinaryReader(fs, Encoding.Default))
- for (long i = fs.Length / (4 + 8 + 8); i > 0; i-- )
- {
- var item = new Tick();
- item.time = br.ReadUInt32();
- item.price = br.ReadDouble();
- item.vol = br.ReadUInt64();
- list.Add(item);
- }
- Console.WriteLine("Reading of BIN file: {0} ms", watch.ElapsedMilliseconds);
- Console.ReadLine();
- }
- }
- struct Tick
- {
- public UInt32 time;
- public double price;
- public UInt64 vol;
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д