制表符分隔文件中的引号

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

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

这一切都很好!

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

“SUMISEI MARU NO 2” – 日本海

这似乎是我的应用程序的一个主要问题。 我得到一个exception,看起来像这样:

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

在那个“原始数据”中,索赔说明字段确实显示带有引号的数据。

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

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

任何帮助是极大的赞赏!

干杯,肖恩

检查有关引号的codeproject文章的注释:

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

您需要在构造函数中指定除了“用作引号”之外还需要另一个字符。

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

我最近解决了一个类似的问题,虽然CsvReader在我的TSV文件的几行之外都能正常工作,最终解决了我的问题是在customDelimiter的构造函数中设置了一个CsvReader

 public static void ParseTSV(string filepath) { using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t')) { //if that didn't work, passing unlikely characters into the other params might help //using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t', '~', '`', '~', ValueTrimmingOptions.None)) { int fieldcount = csvReader.FieldCount; //Does not work, since it's read only property //csvReader.Delimiter = "\t"; string[] headers = csvReader.GetFieldHeaders(); while (csvReader.ReadNextRecord()) { for (int i = 0; i < fieldcount; i++) { string msg = String.Format("{0}\r{1};", headers[i], csvReader[i]); Console.Write(msg); } Console.WriteLine(); } } } 

也许你可以用你的应用程序打开文件,用另一个字符替换每个引用,然后处理它。

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

每个字段可能包含也可能不包含在双引号中(但是某些程序,例如Microsoft Excel,根本不使用双引号)。 如果字段未用双引号括起来,则双引号可能不会出现在字段内。

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

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

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

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

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

如果您希望在将文件送到工具之前预先处理(破解)他们的文件,那么正确的方法是在分隔符前面或后面查找带引号的字段,并将其整个字段包含在另一个集合中报价。

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

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

再次,感谢所有的建议。

干杯,肖恩