题
我有一个打开制表符分隔文本文件的简单应用,并插入数据到数据库中。
我使用这个CSV阅读器来读取数据:的http:// WWW .codeproject.com / KB /数据库/ CsvReader.aspx
和它所有的工作就好了!
现在我的客户端增加了新的字段添加到文件中,这是“ClaimDescription”的端部,并且在一些这些权利要求的描述的,该数据在它具有引号,例如:
“SUMISEI MARU NO 2” - 日本的海
这似乎导致我的应用程序的一大头疼。我得到一个异常,看起来像这样:
在CSV似乎是接近记录在位置“181”“1470”字段'26损坏。当前原始数据:...
和在该“原始数据”,果然如权利要求描述字段示出了在它与数据引号
我想知道是否有人之前曾经有过这个问题,并得到了圆呢? 很显然,我可以要求客户改变他们最初发送给我的数据,但是这是一个自动的过程,他们用它来生成制表符分隔的文件;我宁愿把它作为最后的手段。
我想我可以手之前,使用一个标准的TextReader可能打开该文件,逃避任何报价,内容写回一个新的文件,然后反馈该文件到CSV阅读器。这可能是值得一提的是,这些制表符分隔的文件的平均文件大小为40MB左右。
任何帮助是非常感谢!
干杯,肖恩
解决方案 7
右键 - 红牛和抓我的头的深夜之后,我终于发现了这个问题,它是在“Claim_Description”字段中的逗号。甚至没有想到这一点,因为我使用的是制表符分隔的文件,但只要我做了查找和对文件中的所有逗号代替它的工作绝对没问题!
下一步是找出如何处理之前替换这些逗号。
再次,由于所有的建议。
干杯,肖恩
其他提示
检查有关报价的CodeProject上的文章中评论:
HTTP://www.codeproject的.com /消息/ 3382857 /重新报价-内的最-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阅读器的源文件,另一种选择是修改它来处理那种引用的字符串他们喂养你的。
这种情况也正是为什么至关重要的是有你的工具集源代码的访问权限。
相反,如果你想预处理(黑客),他们的文件他们哪里不给你的工具之前,正确的方法是寻找与领域的报价不会立即在或分离器后面,前面和包围它的整个领域在另一组引号。