CSV + FileHelpers + Двойные кавычки = Кошмар - PullRequest
1 голос
/ 06 сентября 2011

Я не могу справиться с CSV, который получил. Это файл, сгенерированный банком, который выглядит так:

"000,""PLN"",""XYZ"",""2011-08-31"",""2011-08-31"",""0,00"""
1,""E"",""2011-08-30"",""2011-08-31"",""2011-08-31"",""399,00"",""0000103817846977"",""UZNANIE OTRZYMANE ELIXIR"",""23103015080000000550217023"",""XXX"",""POLISA UBEZPIECZENIA NR XXX  "",""000""
3,""E"",""2011-08-31"",""2011-08-31"",""2011-08-31"",""1433,00"",""0000154450232753"",""UZNANIE OTRZYMANE ELIXIR"",""000"",""XXX"",""POLISA UBEZPIECZENIA XXX  "",""000""

(я изменил всю конфиденциальную информацию).

Я пытаюсь разобрать его с самого утра, но ничего страшного. Я использовал пример LINQ to CSV, найденный где-то в сети, один CodeProject (оба они выдавали ошибку, которая говорила, что CSV поврежден), и я закончил FileHelpers, который SEEMS работает, НО:

  1. Он разбивает «399,00» и похожие значения на два поля.
  2. Когда я использую атрибут [(FieldQuoted ()], все идет в ад, поскольку все поля заключены в двойные кавычки. Я подозреваю, что это причина того, что другие парсеры не будут работать.

Есть идеи, как с этим справиться?

Ответы [ 2 ]

2 голосов
/ 06 сентября 2011

Если проблема заключается в двойных кавычках, вы можете предварительно обработать каждую строку, подставив двойные двойные кавычки в одинарные двойные кавычки:

line = line.Replace( "\"\"", "\"" );

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

2 голосов
/ 06 сентября 2011

Я использовал Lumen, CommonLibrary, FileHelpers и т. Д., И я получил класс TextFieldParser (из пространства имен Visual Basic, но без проблем можно использовать в C #). Я рекомендую вам попробовать это. Единственным недостатком является то, что это относительно медленно. Но, похоже, он хорошо справляется с крайними случаями.

Я даже изобрел хитрость, заставляющую его работать с явно недействительными CSV-файлами ("" "и т. Д .; OpenOffice Calc не мог обработать их должным образом) - когда я сталкивался с такой строкой и получал MalformedLineException, я все равно проанализируем его в блоке catch со свойством HasFieldsEnclosedInQuotes, установленным на false, для изменения.

Это правильно разделит строку, оставив все значения в двойных апострофах. Все, что мне нужно было сделать, это удалить эти двойные кавычки «вручную».

...