Разобрать расширенный файл CSV - PullRequest
1 голос
/ 25 марта 2011

Мне нужно загрузить следующий CSV-файл

head1, head2, head3, head4; head5
34 23; 2; "abc";"abc \"sdjh";8
34 23; 2; "abc";"abc 
sdj\;h
jshd";8
34 23; 2; "abc";"abc";8

Функция должна обрабатывать управляющие символы, такие как \" \; \n и \r и новую строку в строках.Есть ли хорошая библиотека для решения этой проблемы?

Ответы [ 3 ]

3 голосов
/ 25 марта 2011

У меня были хорошие результаты при использовании CSV Reader для .Net: http://www.codeproject.com/KB/database/CsvReader.aspx.

1 голос
/ 31 января 2012

Это не правильный файл CSV ...

Строка заголовка будет интерпретироваться как

"head1"," head2"," head3"," head4; head5"

В каждой строке есть только один столбец.

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

Вы можете попробовать CsvHelper (библиотека, которую я поддерживаю). Это довольно гибкий. Вы можете изменить конфигурацию для заголовков и строк и сделать их разными. Вы можете установить, что вы хотите, чтобы разделитель и поле кавычек было. Он также обрабатывает окончания строк \ r, \ n и \ r \ n, даже если в каждой строке используется разное окончание строки.

0 голосов
/ 04 октября 2011

Я не мог получить ничего, чтобы пройти все мои тесты для разбора CSV, поэтому я написал что-то простое, чтобы сделать это. AnotherCsvParser

Он делает все, что мне нужно ... но должно быть легко разбираться и расширяться для ваших нужд.

Дано:

 public class ABCD
 {
     public string A;
     public string B;
     public string C;
     public string D;
 }

Предполагается, что столбцы расположены в порядке, в котором определены поля .. (но было бы легко расширить, чтобы прочитать атрибут или что-то)

Это работает:

    var output = NigelThorne.CSVParser.ReadCSVAs<ABCD>(
"a,\"b\",c,d\n1,2,3,4\n\"something, with a comma\",\"something \\\"in\\\" quotes\",\" a \\\\ slash \",\n,,\"\n\",");

такой, что:

  Assert.AreEqual(4, output.ToArray().Length);
  var row1 = output.ToArray()[0];
  Assert.AreEqual("a", row1.A);
  Assert.AreEqual("b", row1.B);
  Assert.AreEqual("c", row1.C);
  Assert.AreEqual("d", row1.D);

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

...