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

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

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

Есть необходимость часть данных из файла csv перегнать в формат bin. Вот фрагмент тестового кода:
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());

                }

            }
Что можно сделать,чтобы все работало быстрее? Файлов будет несколько тысяч.Данные меняться не будут. Может использовать "как-нибудь" MMF файлы? Можно ускорить процесс чтения csv если прочитать reader.ReadToEnd и уже потом загнать все это в массив через Split? Или вообще не париться с бинарными файлами и все загнать в БД...например SQLite,но в БД уж большие издержки на INSERT возникают...да и потом считывать надо будет...

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

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


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

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

8   голосов , оценка 4 из 5
Похожие ответы