0

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

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

一切正常!

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

“SUMISEI MARU NO 2”——日本海

这似乎给我的应用程序带来了很大的麻烦。我得到一个看起来像这样的异常:

CSV 似乎在位置“181”的记录“1470”字段“26”附近损坏。当前原始数据:...

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

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

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

任何帮助是极大的赞赏!

干杯,肖恩

4

7 回答 7

2

检查关于报价的代码项目文章的评论:

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

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

于 2010-03-11T14:47:57.193 回答
1

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

于 2010-03-11T14:43:06.190 回答
1

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

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();
            }
        }
    }
于 2013-01-07T17:28:28.977 回答
0

使用 OleDbConnection http://social.msdn.microsoft.com/Forums/en/winformsdatacontrols/thread/98fce7d7-b02d-4027-ad2e-2df3a28bd439

于 2010-03-11T14:44:57.653 回答
0

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

于 2010-03-11T14:49:12.107 回答
0

我做了一些搜索,有一个 CSV 文件的 RFC ( RFC 4180 ),这确实明确禁止他们在做什么:

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

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

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

所以如果你愿意,你可以把这个问题扔给他们,并坚持他们给你发送一个“正确的”RFC 4180 CSV 文件。

由于您可以访问该 CSV 阅读器的源文件,因此另一种选择是修改它以处理它们提供给您的引用字符串类型。

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

相反,如果您想在将文件提供给您的工具之前对其文件进行预处理(破解),正确的方法是查找带有引号的字段,而不是紧邻分隔符的前面或后面,并将其整个字段包含在另一个集合中的报价。

于 2010-03-11T14:56:22.560 回答
0

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

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

再次感谢所有建议。

干杯,肖恩

于 2010-03-12T10:25:48.713 回答