2017-01-15 11 views
-1

У меня есть одна большая таблица данных из нескольких миллионов записей. Мне нужно экспортировать это в несколько CSV-файлов определенного размера. Так, например, я выбираю размер файла 5 МБ, и когда я говорю об экспорте, Datatable будет экспортироваться в 4 файла CSV размером 5 МБ, а последний размер файла может отличаться в зависимости от оставшихся записей. Я рассмотрел множество решений здесь, а также посмотрел библиотеку csvhelper, но все, что связано с большими файлами, разделяется на несколько CSV, но не в таблице данных памяти, на несколько файлов CSV на основе указанного размера файла. Я хочу сделать это на C#. Любая помощь в этом направлении будет отличной.Большая таблица данных для нескольких файлов csv определенного размера в .net

Благодаря Jay

+0

Количество файлов = общий размер/5Mb. Вам нужно как-то оценить общий размер, а затем выяснить, сколько вам нужно, просто используйте обычные методы, чтобы разделить это. У вас есть код, который работает для выплескивания файлов на основе _count_ файлов? Если да, отправьте его, и мы сможем помочь вам адаптировать его для размера. –

+0

Спасибо, Ник. Мне нужно преобразовать в таблицу данных памяти в несколько csv. Таким образом, общий размер файла определяется сначала из таблицы данных. Это в таблице данных памяти и небольшом файле, который я хочу разбить. –

+0

Какой код вы уже пробовали? – Sefe

ответ

1

Спасибо @ H.G.Sandhagen и @jdweng для входов. В настоящее время я написал следующий код, который требует работы. Я знаю, что это не идеально, и некоторые улучшения могут быть сделаны и могут быть сделаны более эффективными, если мы сможем предварительно определить длину из массива элементов таблицы данных, как указано Nick.McDermaid. На данный момент я перейду с этим кодом, чтобы разблокировать себя и опубликую окончательную оптимизированную версию, когда я ее закодировал.

public void WriteToCsv(DataTable table, string path, int size) 
     { 
      int fileNumber = 0; 
      StreamWriter sw = new StreamWriter(string.Format(path, fileNumber), false); 
      //headers 
      for (int i = 0; i < table.Columns.Count; i++) 
      { 
       sw.Write(table.Columns[i]); 
       if (i < table.Columns.Count - 1) 
       { 
        sw.Write(","); 
       } 
      } 
      sw.Write(sw.NewLine); 

      foreach (DataRow row in table.AsEnumerable()) 
      { 
       sw.WriteLine(string.Join(",", row.ItemArray.Select(x => x.ToString()))); 
       if (sw.BaseStream.Length > size) // Time to create new file! 
       { 
        sw.Close(); 
        sw.Dispose(); 
        fileNumber ++; 
        sw = new StreamWriter(string.Format(path, fileNumber), false); 
       } 
      } 

      sw.Close(); 
     } 
+0

Я создал подобный ответ, но вы были быстрее. Btw: Три вещи, которые нужно упомянуть: 1.Сепаратор строк ("), обычно используемый в csv, отсутствует. В зависимости от ваших данных вам может понадобиться улучшить это. 2. В ваших файлах csv (кроме первого) отсутствует строка заголовка. 3. Чтобы создать строку заголовка, вы можете используйте 'var header = String.Join (", ", datatable.Columns.Cast () .Select (p => $" \ "{p.ColumnName} \" "));' –

+0

Да @HGSandhagen Спасибо за перечисляя улучшения. На самом деле, я знаю это, и поэтому я поставил это, чтобы ответить, что этот код еще не оптимизирован. В моем случае мне вообще не нужен заголовок в любом из файлов csv. Я храню его в один другой файл, где у меня также есть таблица таблицы сервера. –