2

要读取 CSV 文件,我使用以下语句:

var query = from line in rawLines
    let data = line.Split(';')
    select new
    {
    col01 = data[0],
    col02 = data[1],
    col03 = data[2]
    };

我要读取的 CSV 文件格式不正确,;当用引号包围时,条目可以将分隔符本身作为数据。

例子:

col01;col02;col03
data01;"data02;";data03

我上面的 read 语句在这里不起作用,因为它将第二行解释为四列。

问题:有没有一种简单的方法可以正确处理这个格式错误的 CSV?也许还有另一个 LINQ 查询?

4

3 回答 3

11

只需使用 CSV 解析器并停止滚动您自己的操作:

using (var parser = new TextFieldParser("test.csv"))
{
    parser.CommentTokens = new string[] { "#" };
    parser.SetDelimiters(new string[] { ";" });
    parser.HasFieldsEnclosedInQuotes = true;

    // Skip over header line.
    parser.ReadLine();

    while (!parser.EndOfData)
    {
        string[] fields = parser.ReadFields();
        Console.WriteLine("{0} {1} {2}", fields[0], fields[1], fields[2]);
    }
}

TextFieldParser内置在 .NET 中。只需添加对Microsoft.VisualBasic程序集的引用,您就可以开始了。真正的 CSV 解析器会很乐意处理这种情况。

于 2013-10-28T08:27:08.570 回答
1

手动解析 CSV 文件总是会导致这样的问题。我建议您使用CsvHelper之类的第三方工具来处理解析。

此外,显式解析逗号不是一个好主意,因为您的分隔符可以在您的计算机环境选项中被覆盖。

让我知道如果我可以进一步提供帮助,

马特

于 2013-10-28T08:26:55.247 回答
0

不是很优雅,但是在使用您的方法后,您可以检查任何 colxx 是否包含未完成的引号(单个),您可以将其与下一个 colxx 连接起来。

于 2013-10-28T08:22:55.680 回答