制表符分隔文件中的引号
我有一个简单的应用程序,它打开一个制表符分隔的文本文件,并将该数据插入数据库。
我正在使用此 CSV 阅读器来读取数据:http://www.codeproject。 com/KB/database/CsvReader.aspx
一切都工作得很好!
现在我的客户在文件末尾添加了一个新字段,即“ClaimDescription”,并且在其中一些索赔描述中,数据中包含引号,例如:
“SUMISEI MARU NO 2” - 日本海
这似乎给我的应用程序带来了很大的麻烦。我收到一个异常,如下所示:
CSV 似乎在位置“181”处的记录“1470”字段“26”附近已损坏。当前原始数据:...
在“原始数据”中,索赔描述字段确实显示了带引号的数据。
我想知道是否有人曾经遇到过这个问题,并且解决了? 显然,我可以要求客户更改他们最初发送给我的数据,但这是他们用来生成制表符分隔文件的自动化过程;我宁愿用它作为最后的手段。
我想我可以事先使用标准 TextReader 打开文件,转义任何引号,将内容写回到新文件中,然后将该文件输入 CSV 阅读器。值得一提的是,这些制表符分隔文件的平均文件大小约为 40MB。
非常感谢任何帮助!
干杯,肖恩
I've got a simple application that opens a tab-delimited text file, and inserts that data into a database.
I'm using this CSV reader to read the data: http://www.codeproject.com/KB/database/CsvReader.aspx
And it is all working just fine!
Now my client has added a new field to the end of the file, which is "ClaimDescription", and in some of these claim descriptions, the data has quotes in it, example:
"SUMISEI MARU NO 2" - sea of Japan
This seems to be causing a major headache for my app. I get an exception which looks like this:
The CSV appears to be corrupt near record '1470' field '26 at position '181'. Current raw data : ...
And in that "raw data", sure enough the claim description field shows data with quotes in it.
I want to know if anyone has ever had this problem before, and got round it?
Obviously I can ask the client to change the data they originally send to me, but this is an automated process that they use to generate the tab-delimited file; and I'd rather use that as a last resort.
I was thinking I could maybe open the file using a standard TextReader before hand, escape any quotes, write the content back into a new file, then feed that file into the CSV Reader. It is probably worth mentioning that the average file size of these tab-delimited files is around 40MB.
Any help is greatly appreciated!
Cheers, Sean
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(7)
我最近解决了一个类似的问题,虽然 CsvReader 在我的 TSV 文件中除了几行之外的所有行上都能正常工作,但最终解决我的问题的是在 CsvReader 的构造函数中设置一个 customDelimiter
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 阅读器的源文件,因此另一个选择是修改它以处理它们向您提供的带引号的字符串类型。
这种情况正是为什么拥有对工具集的源代码访问权限至关重要的原因。
相反,如果您想在将文件提供给您的工具之前对其文件进行预处理(破解),则正确的方法是查找带有引号的字段,而不是紧邻分隔符前面或后面,并将其整个字段包含在另一组中的报价。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
检查 codeproject 文章中有关引用的评论:
http://www.codeproject.com/Messages/3382857/Re-Quotes-inside-of-the-Field.aspx
您需要在构造函数中指定您希望除 " 之外的另一个字符用作引号。
Check the comment on the codeproject article about quotes:
http://www.codeproject.com/Messages/3382857/Re-Quotes-inside-of-the-Field.aspx
You need to specify in the constructor that you want another character besides " to be used as quotes.