正则表达式分割线(csv文件)

时间:2010-07-16 20:27:14

标签: c# .net regex csv

我在正则表达方面不擅长。有人可以帮我写出正则表达式吗?

在阅读csv文件时,我可能会有这样的值。

"Artist,Name",Album,12-SCS
"val""u,e1",value2,value3

输出:

Artist,Name  
Album
12-SCS
Val"u,e1 
Value2 
Value3

更新: 我喜欢使用Oledb提供商的想法。我们在网页上有文件上传控制,我使用流阅读器读取文件的内容,而文件系统上没有实际的保存文件。有没有办法我可以使用Oledb提供程序,因为我们需要在连接字符串中指定文件名,在我的情况下,我没有在文件系统上保存文件。

7 个答案:

答案 0 :(得分:14)

只需添加我今天早上工作的解决方案。

var regex = new Regex("(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)");

foreach (Match m in regex.Matches("<-- input line -->"))
{
    var s = m.Value; 
}

如您所见,您需要每行调用regex.Matches() 。然后它将返回一个MatchCollection,其具有与列相同数量的项目。显然,每个匹配的Value属性是已解析的值。

这仍然是一项正在进行的工作,但它很乐意解析CSV字符串,如:

2,3.03,"Hello, my name is ""Joshua""",A,B,C,,,D

答案 1 :(得分:8)

实际上,很容易将CVS线与正则表达式相匹配。试试这个:

StringCollection resultList = new StringCollection();
try {
    Regex pattern = new Regex(@"
        # Parse CVS line. Capture next value in named group: 'val'
        \s*                      # Ignore leading whitespace.
        (?:                      # Group of value alternatives.
          ""                     # Either a double quoted string,
          (?<val>                # Capture contents between quotes.
            [^""]*(""""[^""]*)*  # Zero or more non-quotes, allowing 
          )                      # doubled "" quotes within string.
          ""\s*                  # Ignore whitespace following quote.
        |  (?<val>[^,]*)         # Or... zero or more non-commas.
        )                        # End value alternatives group.
        (?:,|$)                  # Match end is comma or EOS", 
        RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);
    Match matchResult = pattern.Match(subjectString);
    while (matchResult.Success) {
        resultList.Add(matchResult.Groups["val"].Value);
        matchResult = matchResult.NextMatch();
    } 
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}

免责声明:正则表达式已在RegexBuddy中生成(生成此代码段),并且正确匹配OP测试数据,但C#代码逻辑未经测试。 (我无法访问C#工具。)

答案 2 :(得分:6)

正则表达式不适用于此。使用CSV 解析器builtin一个或3rd party个。

答案 3 :(得分:5)

TextFieldParser班看一看。它位于Microsoft.VisualBasic程序集中,并进行分隔和固定宽度解析。

答案 4 :(得分:1)

尝试CsvHelper(我维护的库)。它可以通过NuGet获得。

您可以轻松地将CSV文件读入自定义类集合。它也很快。

var streamReader = // Create a StreamReader to your CSV file
var csvReader = new CsvReader( streamReader );
var myObjects = csvReader.GetRecords<MyObject>();

答案 5 :(得分:-1)

正则表达式可能会变得过于复杂。在逗号上拆分行,然后迭代结果位并将它们连接起来“连接字符串中的双引号数”不均匀。

“你好,这个”,是“a”“测试”“”

... ...分割

“你好|这个”|是| “a”“test”“”

...迭代并合并'直到你有一个偶数个双引号......

“你好,这个” - 偶数引号(注意通过在位之间插入拆分删除逗号)

是 - 偶数引号

“a”“test”“” - 偶数引号

...然后剥离前导和尾随引用(如果存在)并将“”替换为“。

答案 6 :(得分:-1)

可以使用以下代码完成:

using Microsoft.VisualBasic.FileIO;
string csv = "1,2,3,"4,3","a,"b",c",end";
TextFieldParser parser = new TextFieldParser(new StringReader(csv));
//To read from file
//TextFieldParser parser = new TextFieldParser("csvfile.csv");
parser.HasFieldsEnclosedInQuotes = true;
parser.SetDelimiters(",");
string[] fields =null;
while (!parser.EndOfData)
{
    fields = parser.ReadFields();
}
parser.Close();