Приводим данные из 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; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д