我有一个简单的应用程序打开制表符分隔的文本文件,并将该数据插入数据库。
我正在使用此CSV阅读器来阅读数据:http://www.codeproject.com/KB/database/CsvReader.aspx
这一切都很好!
现在我的客户端在文件末尾添加了一个新字段,即“ClaimDescription”,在其中一些声明描述中,数据中包含引号,例如:
“SUMISEI MARU NO 2” - 日本海
这似乎引起了我的应用程序的一个主要问题。我得到一个看起来像这样的例外:
在位于'181'的记录'1470'字段'26附近,CSV似乎已损坏。目前的原始数据:......
在“原始数据”中,确实声明描述字段显示带有引号的数据。
我想知道以前有没有人遇到过这个问题,然后绕过它? 显然,我可以要求客户端更改他们最初发送给我的数据,但这是一个自动化过程,用于生成制表符分隔文件;我宁愿把它作为最后的手段。
我原以为我可以手动使用标准的TextReader打开文件,转义任何引号,将内容写回新文件,然后将该文件输入CSV阅读器。值得一提的是,这些制表符分隔文件的平均文件大小约为40MB。
非常感谢任何帮助!
干杯,肖恩
答案 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)
使用OleDbConnection http://social.msdn.microsoft.com/Forums/en/winformsdatacontrols/thread/98fce7d7-b02d-4027-ad2e-2df3a28bd439
答案 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”字段中的逗号。甚至没有想到这一点,因为我使用的是制表符分隔文件,但是一旦我找到并替换文件中的所有逗号,它就可以正常工作了!
下一步是找出如何在处理之前替换这些逗号。
再次感谢所有建议。
干杯,肖恩