0

在我们公司,我们从为我们建议 CSV 文件的供应商那里收到分发信息。但是,他们无法转义文本字段中的引号字符,这会导致多行被忽略;使用文本字段解析器。

坏线的一个例子:

"CABLES TO GO","87029","5.0200","47","757120870296","87029", "WP SGL ALUM 1 1/2" GROMMET"

对应的代码片段是:

private static IEnumerable<string> ParseHelper(String line, int lineRead, Encoding enc)
{
    MemoryStream mem = new MemoryStream(enc.GetBytes(line));
    TextFieldParser readerTemp = new TextFieldParser(mem, enc) {CommentTokens = new[] {"#"}};
    readerTemp.SetDelimiters(new[] { "," });
    readerTemp.HasFieldsEnclosedInQuotes = true;
    readerTemp.TextFieldType = FieldType.Delimited;
    readerTemp.TrimWhiteSpace = true;
    try
    {
        var items = readerTemp.ReadFields();
        return items;
    }
    catch (MalformedLineException ex)
    {
        throw new MalformedLineException(String.Format(
            "Line {0} is not valid and will be skipped: {1}\r\n{2}",
            lineRead, readerTemp.ErrorLine, ex));
    }
}

此外,该供应商无法更改源文件以转义这些引号。像这样的这些行的最佳解决方法是什么?

4

1 回答 1

1

没有变通方法。

CSV 规范允许使用非转义引号来封装字段值。如果他们在字段值中向您发送带有未转义引号的文件,那么您就有问题了。

这些不是 CSV 文件(它们违反了规范,因此不是您认为的那样)。

如果您坚持尝试将它们解析为 CSV,则可以首先转义所有未由记录终止符或字段分隔符进行的未转义引号。

这种方法只会走这么远。有时,损坏的数据无法完好无损。

于 2015-02-05T11:04:54.837 回答