【问题标题】:CSV Regular ExpressionCSV 正则表达式
【发布时间】:2011-10-20 08:29:40
【问题描述】:

我继承了一些使用正则表达式来解析 CSV 格式数据的代码。之前它不需要处理空字符串字段,但是要求已经改变,因此空字符串字段是可能的。

我已经改变了正则表达式:

new Regex("((?<field>[^\",\\r\\n]+)|\"(?<field>([^\"]|\"\")+)\")(,|(?<rowbreak>\\r\\n|\\n|$))");

到这里

new Regex("((?<field>[^\",\\r\\n]*)|\"(?<field>([^\"]|\"\")*)\")(,|(?<rowbreak>\\r\\n|\\n|$))");

(即我已将 + 更改为 *)

问题是我现在最后得到了一个额外的空白字段,例如“ID,Name,Description”返回四个字段:“ID”、“Name”、“Description”和“”

谁能看出原因?

【问题讨论】:

  • 我不熟悉 C#,但没有能够解析 CSV 的包/模块/类吗?
  • 不是开箱即用 @Felix,但那里有大约 17.2 亿个实现。
  • 你想处理什么:Id,,Name?
  • Id,,Name 就是一个例子,是的。我也想处理 ,Name 和 Id,

标签: c# regex csv


【解决方案1】:

这个:

var rx = new Regex("((?<=^|,)(?<field>)(?=,|$)|(?<field>[^\",\\r\\n]+)|\"(?<field>([^\"]|\"\")*)\")(,|(?<rowbreak>\\r\\n|\\n|$))");

我将“空白”字段的处理移至第三个“或”。现在,"" 的处理已经工作了(你不需要修改它,它是你代码的第二个(?&lt;field&gt;) 块),所以你需要处理四种情况:

,
,Id
Id,
Id,,Name

这个应该做的:

(?<=^|,)(?<field>)(?=,|$)

一个空字段必须在行的开头^, 之前,长度必须为零((?&lt;field&gt;) 捕获中没有任何内容)并且后面必须跟一个@ 987654329@ 或行尾$

【讨论】:

  • 谢谢。这似乎有效。我所有的单元测试现在都通过了。
【解决方案2】:

我建议您使用FileHelpers 库。它易于使用,可以完成工作并且维护您的代码会容易得多。

【讨论】:

  • FileHelpers 是否允许您读取带有任意字段的 CSV 数据?
  • @EasyTimer:你说的任意是什么意思?在任何情况下,您都可以使用该库将 csv 文件反序列化为您自己的类,并且该库还支持可选(空)字段。
  • @Paulo,CSV 文件的格式直到运行时才知道。即我们不知道它可能包含哪些字段。我的理解是 FileHelpers 旨在预先了解结构,以便可以创建一个类来保存数据。
  • @EasyTimer:好吧,我还没有理解运行时要求!在这种情况下,FileHelpers 不是您所需要的。
【解决方案3】:

您的正则表达式的问题在于它与空字符串匹配。 现在$ 的工作方式有点像前瞻 - 它保证匹配在字符串的末尾,但不是匹配的一部分。

所以当你有“ID,Name,Description”时,你的第一个匹配是

ID,,其余为"Name,Description"

那么下一场比赛就是

Name,,其余为"Description"

下一场比赛:

Description,其余为""

所以最后匹配的是空字符串。

【讨论】:

  • 谢谢@Peter。这很好地解释了为什么我会得到额外的空字符串。
猜你喜欢
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
相关资源
最近更新 更多