【问题标题】:java regex to remove unwanted double quotes in csvjava正则表达式删除csv中不需要的双引号
【发布时间】:2016-07-12 15:31:57
【问题描述】:

我有一个包含以下行的 csv 文件。如您所见,数字没有用双引号括起来。

String theLine = "Corp:Industrial","5Nearest",51.93000000,"10:21:29","","","","10:21:29","7/5/2016","PER PHONE CALL WITH SAP, CORRECTING "C","359/317 97 SMRD 96.961 MADV",""

我尝试阅读上面的行并使用 regEX 进行拆分

String[] tokens = theLine.split(",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))");

这不会像我想要的那样在每个逗号处拆分。 “每个电话与 SAP,更正“C”,因为它有额外的,(逗号)和“(双引号)而搞砸了。有人可以帮我写一个正则表达式,它将转义一个额外的双引号和一个带有两个双引号的逗号。

我基本上想要:

"Corp:Industrial","5Nearest",51.93000000,"10:21:29","","","","10:21:29","7/5/2016","**PER PHONE CALL WITH SAP CORRECTING C**","359/317 97 SMRD 96.961 MADV",""

【问题讨论】:

  • 使用edit 选项并将您的代码示例包装在code block 中(编辑器菜单中的{} 图标)。这样*\等所有字符都会被打印出来。
  • 您可以修改生成该 CSV 行的源吗?由于您的引号不平衡/未转义,因此它无法正常工作。
  • 如果您确定这些 orphan 引号从不在逗号附近,则可以轻松解决,否则了解每个字段的外观可能会有所帮助。
  • 获取 CSV 解析器,而不是用错误的正则表达式重新发明轮子。

标签: java regex string csv


【解决方案1】:

解析器比正则表达式更擅长于某些工作,而这类事情通常就是其中之一。我并不是说你不能让它为你工作,但是......还有开源的 CSV 解析器你可以投入使用。

话虽如此,您的 CSV 在我看来是可疑的。

"PER PHONE CALL WITH SAP, CORRECTING "C",

该值包含三个引号 - 它是否意味着表示一个内部只有一个引号的字符串?还是应该将 C 和字符串一样用引号括起来?

通常,如果要在双引号中包含双引号,则需要特殊的语法。对于 CSV,最常见的选项是将其加倍,或使用反斜杠之类的字符转义:

"PER PHONE CALL WITH SAP, CORRECTING ""C""",

或者:

"PER PHONE CALL WITH SAP, CORRECTING \"C\"",

这些都不会直接改变您使用正则表达式的问题,但是一旦您拥有格式良好的 CSV,您成功解析它的几率就会上升。

【讨论】:

  • Geoffrey,我已经尝试过 apache CSVParser,当它读取这一特定行时,它会爆炸。就像你说的,这不是格式良好的 CSV。我们时不时地用这种格式创建文件
  • Geoffrey,我已经尝试过 apache CSVParser,当它读取这一特定行时,它会爆炸。就像你说的,这不是格式良好的 CSV。我们时不时地会以这种格式创建文件。我的工作是解析这些文件。当我做 theLine.split(",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))");我只得到 4 个令牌,而不是在每个 ",
  • 我认为不可能有一个真正可靠的解决方案来处理格式错误的 CSV。您也许可以将一些东西拼凑在一起以处理更明显的情况,这可能就足够了。但是如果你可能得到不匹配的非转义引号......我仍然觉得你应该推迟获得格式良好的文件。如果你真的不能这样做......我想我可能会转向编写自定义解析器而不是尝试处理正则表达式,但如果你不能确定字符串何时结束,即使这样也会非常困难.
  • 感谢 Geoffrey 的回复,我最终编写了一个自定义解析器。
猜你喜欢
  • 2013-08-27
  • 2018-10-29
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多