使用正则表达式在C#中解析具有多种格式的CSV文件

时间:2012-08-30 05:46:37

标签: c# .net regex

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

  

123,是的,这是一份备忘录

     

234,false,“这也是一份备忘录”

     

345,真实,

     456,是的,在我之上是一份空白的备忘录

     567,假,“这有一个,

     

在其中“

     

678,是的,这有一个,在它< ---这个记录应该被拒绝

     

789,假 “”

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

我还找到了一个在http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

上测试正则表达式格式字符串的好工具

直到现在我使用了以下格式字符串 ^( “”(?:[^ “”] | “” “”)的 “” | [^,] ),( “”(?:[^ “”] | “” “” ) “” | [^,] )$

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

提前致谢。


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

1 个答案:

答案 0 :(得分: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();
    }
}