正则表达式匹配 CSV 文件

Posted

技术标签:

【中文标题】正则表达式匹配 CSV 文件【英文标题】:Regex match a CSV file 【发布时间】:2011-05-15 18:02:14 【问题描述】:

我正在尝试创建一个正则表达式来匹配 CSV 记录文件,格式为:

optional value, , ,, again some value; this is already, next record;

现在有一个逗号 (10) 的上限分隔每条记录的属性,并且有无限数量的 ; 分隔每条记录。值可能存在也可能不存在。我对正则表达式没有经验,到目前为止我的努力是徒劳的。请帮忙。如有必要,我将提供更多详细信息。

编辑

我想验证文件是否符合要求的格式并获取其中的记录数。

【问题讨论】:

你希望结果是什么? 如果你有大量记录,我建议不要使用 Regex,因为它的性能与手动智能解析相比相形见绌,除非你只是对学习 Regex 感兴趣。 文件是否包含转义的逗号或分号,例如a,b,"c1,;;c2",d;?如果没有,您可以为每条记录按; 拆分,然后按, 拆分(或简单地计算分号)。 @BeemerGuy:谢谢你的建议。我正在使用它(与 Kobi 提出的相同),但老板想看一个正则表达式。我也很感兴趣。应该永远不会超过 500 条记录。 【参考方案1】:

您真的需要为此使用正则表达式吗?可能有点矫枉过正。我只需执行一个 String.Split() 来获取记录,然后在每条记录上执行另一个 String.Split() 来获取值。那么也很容易获得元素的数量等。

如果您真的想使用正则表达式,我会再次使用两个步骤: /(.*?);/ 获取数据集; /(.*?)[,;]/ 获取值。

可能也可以使用一个正则表达式来完成,但我认为这有点过头了(因为您必须找到子匹配项等。识别它们的父记录等)。

转义字符是另一回事,但做起来很相似:例如/(.*?[^\\]);/

【讨论】:

完全同意,正则表达式,尤其是反向引用往往很慢,所以最好使用拆分。【参考方案2】:

试试这个

bool isvalid = csv.Split(';')
                    .Select(c => c.Split(',')
                        .Count())
                    .Distinct()
                    .Count() == 1;

【讨论】:

解析 CSV 并不像将其拆分为单个字符那么简单。 为什么不呢? - 这是 OP 想要的 这真的取决于 CSV 中预期的数据。一旦你有了字符串,它就会变得有点复杂,因为你不能只是拆分它。 我真的不明白你的保留意见。 CSV 是用逗号分隔的字符串列表 - 它真的没有比这更简单了 示例数据集可能是:55,192,139290,“哇,好故事!请提供更多信息!”注释格式会破坏它,但在此示例中,您将获得 5 个值,其中第四个包含 '"Wow' - 不是整个文本字符串,【参考方案3】:

让我想起著名的文章形式编码恐怖:Regular Expressions: Now You Have Two Problems。

FileHelpers 在处理 CSV 或其他文本格式时节省了我的时间。

【讨论】:

以上是关于正则表达式匹配 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章

pyspark用正则表达式读取csv文件

读取csv文件和匹配时间的正则表达式

正则表达式匹配换行

使用正则表达式加载数据查询

Unix shell脚本中的正则表达式[关闭]

通过正则表达式python爬取指定网页中的参数内容,保存到指定数据文件中