Приводим данные из 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;
}
}