制表符分隔文件中的引号

时间:2010-03-11 14:40:37

标签: c# csv quotes textreader

我有一个简单的应用程序打开制表符分隔的文本文件,并将该数据插入数据库。

我正在使用此CSV阅读器来阅读数据:http://www.codeproject.com/KB/database/CsvReader.aspx

这一切都很好!

现在我的客户端在文件末尾添加了一个新字段,即“ClaimDescription”,在其中一些声明描述中,数据中包含引号,例如:

  “SUMISEI MARU NO 2” - 日本海

这似乎引起了我的应用程序的一个主要问题。我得到一个看起来像这样的例外:

  

在位于'181'的记录'1470'字段'26附近,CSV似乎已损坏。目前的原始数据:......

在“原始数据”中,确实声明描述字段显示带有引号的数据。

我想知道以前有没有人遇到过这个问题,然后绕过它? 显然,我可以要求客户端更改他们最初发送给我的数据,但这是一个自动化过程,用于生成制表符分隔文件;我宁愿把它作为最后的手段。

我原以为我可以手动使用标准的TextReader打开文件,转义任何引号,将内容写回新文件,然后将该文件输入CSV阅读器。值得一提的是,这些制表符分隔文件的平均文件大小约为40MB。

非常感谢任何帮助!

干杯,肖恩

7 个答案:

答案 0 :(得分:2)

请改用FileHelpers库。它被广泛使用,并将处理引用的字段或包含引号的字段。

答案 1 :(得分:2)

检查有关引号的代码项目文章的评论:

http://www.codeproject.com/Messages/3382857/Re-Quotes-inside-of-the-Field.aspx

您需要在构造函数中指定除“要用作引号之外的其他字符。

答案 2 :(得分:1)

我最近解决了类似的问题,尽管CsvReader在我的TSV文件的几行之外的所有行都正常工作,最终解决了我的问题是在{{1}的构造函数中设置customDelimiter }

CsvReader

答案 3 :(得分:0)

答案 4 :(得分:0)

也许您可以使用您的应用程序打开该文件,并将每个引号替换为另一个字符,然后进行处理。

答案 5 :(得分:0)

我做了一些搜索,并且有一个用于CSV文件的RFC(RFC 4180),这明确禁止他们正在做的事情:

  

每个字段可能包含也可能不包含在双引号中(但是   某些程序(如Microsoft Excel)不使用双引号   在所有)。如果字段没有用双引号括起来,那么   双引号可能不会出现在字段内。

基本上,如果他们想要这样做,他们需要将整个字段用引号括起来,如下所示:

,""SUMISEI MARU NO 2" - sea of Japan",

因此,如果你想要,你可以将这个问题抛给他们,并坚持要求他们发送“适当的”RFC 4180 CSV文件。

由于您可以访问该CSV阅读器的源文件,因此可以修改它以处理它们为您提供的引用字符串。

这种情况正是让源代码访问您的工具集至关重要的原因。

如果您希望在将文件送到工具之前对其文件进行预处理(hack),那么正确的方法是在分隔符前面或后面查找带引号的字段,并将其整个字段括起来在另一组报价中。

答案 6 :(得分:0)

对 - 在一个深夜的红头发和我的头后,我最终发现了问题,它是“Claim_Description”字段中的逗号。甚至没有想到这一点,因为我使用的是制表符分隔文件,但是一旦我找到并替换文件中的所有逗号,它就可以正常工作了!

下一步是找出如何在处理之前替换这些逗号。

再次感谢所有建议。

干杯,肖恩