0

我一直在尝试传递一个包含三个字段的 csv 文件。前两个字段很简单,很容易提取,问题在于第三个字段本质上是一个字符串,因此可以包含特殊字符,包括“,”它用于分隔字段。我尝试在两个'"'(双引号)之间包含字符串字段。但我的要求是简单字符串(没有特殊字符)可以在没有双引号的情况下存在。我还需要处理字符串中的下一行。下面是csv 文件的样本。

123,真的,这是备忘录

234,false,"这也是备忘录"

第345章,

456,真的,在我上面是一张空白的备忘录

567,false,"这有一个 ,

在里面”

678,true,This has a , in it <--- 这条记录应该被拒绝

789,假,“”

890,true,在我之上也是有效的空白备忘录

我还在http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx找到了一个测试正则表达式格式字符串的好工具

到目前为止,我使用了以下格式字符串 ^(""(?:[^""]|"""") ""|[^,] ),(""(?:[^""]|"" "") ""|[^,] )$

这种格式字符串的问题在于它不处理多行,并且不拒绝带有起始双引号但缺少结束双引号的字符串。

提前致谢。


感谢您的帮助,但我需要解析 CSV 中的自定义数据,并且必须创建自己的自定义解析器。我分别解析每个字段,并在小块中使用正则表达式字符串。

4

1 回答 1

4

没有必要再次发明这个轮子。我建议使用现有的 CSV 解析器,但有很多不错的选择。

我在CSVReader上取得了巨大的成功,它非常快速且易于使用。基本用法:

using (CsvReader csv = new CsvReader(new StreamReader("data.csv"), true))
{
    int fieldCount = csv.FieldCount;
    string[] headers = csv.GetFieldHeaders();

    while (csv.ReadNextRecord())
    {
        for (int i = 0; i < fieldCount; i++)
            Console.Write(string.Format("{0} = {1};", headers[i], csv[i]));

        Console.WriteLine();
    }
}
于 2012-08-30T05:50:41.373 回答