【问题标题】:Using RegEx to read through a CSV file使用 RegEx 读取 CSV 文件
【发布时间】:2012-08-03 13:44:19
【问题描述】:

我有一个 CSV 文件,其中包含以下类型的数据:

0,'VT,C',0,
0,'C,VT',0,
0,'VT,H',0,

我希望得到以下输出

0
VT,C
0
0
C,VT
0
0
VT,H
0

因此,在逗号上拆分字符串,但忽略引号内的逗号。目前我正在使用以下正则表达式:

("(?:^|,)(\"(?:[^\"]+|\"\")*\"|[^,]*)"

但是这给了我以下结果:

0
VT
C
0
0
C
VT
0
0
VT
H
0

这表明 RegEx 没有正确读取引号。任何人都可以提出一些可能有帮助的改变吗?

【问题讨论】:

标签: c# regex csv


【解决方案1】:

通常在 CSV 解析方面,人们使用非常适合他们用来编写应用程序的编程语言的特定库。

无论如何,如果您要使用正则表达式来进行非常松散(!)的解析,您可以尝试使用以下内容:

'(?<value>[^']*?)'

它将匹配单引号之间的任何内容,并且假设 csv 文件格式正确,它不会错过任何字段。当然,它不接受嵌入式引号,但它很容易完成工作。这就是我需要快速完成工作时使用的方法。请不要将其视为您问题的完整解决方案...它仅适用于您所描述的要求并且输入格式正确的特殊条件。

[编辑]

我再次检查了您的问题,并注意到您还想包含未引用的字段...好吧,在这种情况下,我的表达将根本不起作用。不管怎样,听着……如果你认真思考你的问题,你会发现这是很难在没有歧义的情况下解决的。因为您需要固定规则,并且如果您允许带引号和不带引号的字段,解析器将很难找出合法的逗号作为分隔符/引号。

模拟这种解决方案的另一个表达式可能是:

('[^']+'|[^,]+),?

它将匹配引用/未引用的字段...无论如何我不确定它是否需要假设 csv 必须遵守严格的条件。据我所知,这将比拆分策略更安全...您只需要收集所有匹配项并在目标字符串上打印matched_value + \r\n

【讨论】:

    【解决方案2】:

    此正则表达式基于您在 'value'

    前后有 1 位的事实
    Regex.Replace(input, @"(?:(?<=\d),|,(?=\d))", "\n");
    

    你可以在RegexStorm上测试一下

    【讨论】:

      【解决方案3】:
      foreach(var m in Regex.Matches(s,"(('.*?')|[0-9])"))
      

      【讨论】:

        【解决方案4】:

        我已经设法获得以下方法来根据需要读取文件:

        public List<string> SplitCSV(string input, List<string> line)
            {
        
                Regex csvSplit = new Regex("(([^,^\'])*(\'.*\')*([^,^\'])*)(,|$)", RegexOptions.Compiled);
        
                foreach (Match match in csvSplit.Matches(input))
                {
                    line.Add(match.Value.TrimStart(','));
                }
                return line; 
            }
        

        感谢大家的帮助。

        【讨论】:

        • 实际上这不会编译,因为您应该将值添加到 hot 列表中......并且应该使用 TrimEnd() 而不是 TrimStart()。这使用了我建议的策略,但使用了不同的正则表达式。您的表达式不考虑与上述示例不完全相同的情况。这就是为什么我写了一个更通用的表达式。无论如何,您似乎提出了一个问题,然后让讨论走自己的路。希望您的解决方案不会在更多情况下失败。
        • 输入应该代表什么?
        猜你喜欢
        • 2016-08-04
        • 2021-10-02
        • 2018-05-24
        • 2015-06-12
        • 2011-10-28
        • 2014-12-15
        • 2011-08-12
        • 2023-03-04
        相关资源
        最近更新 更多