正则表达式匹配 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 文件的主要内容,如果未能解决你的问题,请参考以下文章