2

我似乎无法处理我得到的 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 结束,它似乎可以工作,但是:

  1. 它将“ 399,00”和类似的值分成两个字段。
  2. 当我使用 [(FieldQuoted()] 属性时,一切都变得糟糕透顶,因为所有字段都用双引号引起来。我怀疑这就是其他解析器无法工作的原因。

任何想法如何处理它?

4

2 回答 2

3

如果问题似乎是双引号,您可以通过用单双引号替换双双引号来预处理每一行:

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

处理完整个文件后,您可以让它由任何其他 CSV 处理器处理。无论如何,编写自己的可能会更容易。

于 2011-09-06T12:42:12.053 回答
2

我一直在使用 Lumen、CommonLibrary、FileHelpers 等,最终得到了TextFieldParser类(来自 Visual Basic 命名空间,但可以在 C# 中使用没有任何问题)。我建议你试试。唯一的缺点是它相对较慢。但它似乎很好地应对了边缘情况。

我什至发明了一个技巧,让它处理明显无效的 CSV 文件(“””等;OpenOffice Calc 无法正确处理它们) - 当我遇到这样的一行并得到 aMalformedLineException时,我仍然会在其中解析它属性设置为,的catch块进行更改。HasFieldsEnclosedInQuotesfalse

它会正确拆分行,只需将所有值留在双撇号中。我所要做的就是“手动”删除这些双引号。

于 2011-09-06T12:37:38.440 回答