Чтение/запись CSV/файлов с разделением табуляцией в c#

Я должен читать из CSV/файла с разделением табуляцией и записать в такой файл также от .NET.

Трудность состоит в том, что я не знаю структуру каждого файла и потребности записать cvs/tab файл в таблицу данных, которую библиотека FileHelpers, кажется, не поддерживает.

Я уже записал это для Excel с помощью OLEDB, но не могу действительно видеть способ записать файл вкладки для этого, так вернется в библиотеку.

Кто-либо может помочь с предложениями?

13
задан Tim Almond 28 June 2010 в 17:17
поделиться

4 ответа

Я использовал этот CsvReader , он действительно отличный и хорошо настраиваемый. Он хорошо себя ведет со всеми видами экранирования строк и разделителей. Экранирование в других быстрых и грязных реализациях было плохим, но эта библиотека действительно хороша для чтения. С помощью нескольких дополнительных строк кода вы также можете добавить кеш, если вам нужно.

Написание не поддерживается, но реализовать самостоятельно довольно тривиально. Или вдохновитесь этим кодом .

8
ответ дан 1 December 2019 в 22:06
поделиться

.NET поставляется с парсером CSV/tab delminited file, называемым классом TextFieldParser.

http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx

Он поддерживает полный RFC для CSV-файлов и действительно хорошие отчеты об ошибках.

13
ответ дан 1 December 2019 в 22:06
поделиться

Вот пара реализаций чтения CSV:

http://www.codeproject.com/KB/database/CsvReader.aspx

http://www.heikniemi.fi/jhlib/ (только одна часть библиотеки; включает также CSV writer)

Я сомневаюсь, что существует стандартный способ конвертировать CSV в DataTable или базу данных "автоматически", вам придется писать код для этого. Как это сделать - отдельный вопрос.

1
ответ дан 1 December 2019 в 22:06
поделиться

Вы создадите свою таблицу данных в коде, и (предполагая наличие строки заголовка) сможете создать столбцы на основе первой строки в файле. После этого будет просто читать файл и создавать новые строки на основе содержащихся в нем данных.

Вы можете использовать что-то вроде этого:

DataTable Tbl = new DataTable();
using(StreamReader sr = new StreamReader(path))
{
  int count = 0;
  string headerRow = sr.Read();
  string[] headers = headerRow.split("\t") //Or ","
  foreach(string h in headers)
  {
    DataColumn dc = new DataColumn(h);
    Tbl.Columns.Add(dc);
    count++;
  }
  while(sr.Peek())
  {
    string data = sr.Read();
    string[] cells = data.Split("\t") 
    DataRow row = new DataRow();
    foreach(string c in cells)
    {
      row.Columns.Add(c);
    }
    Tbl.Rows.Add(row);
  }
}

Приведенный выше код не компилировался, поэтому в нем могут быть ошибки, но он должен вывести вас на правильный путь.

1
ответ дан 1 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: