如何删除额外的双引号?

时间:2011-10-25 09:40:08

标签: ruby regex

在格式错误的.c​​sv文件中,有一行数据带有额外的双引号,例如最后一行:

Name,Comment
"Peter","Nice singer"
"Paul","Love "folk" songs"

如何删除folk周围的双引号并将字符串替换为:

Name,Comment
"Peter","Nice singer"
"Paul","Love _folk_ songs"

5 个答案:

答案 0 :(得分:8)

在Ruby 1.9中,以下工作:

result = subject.gsub(/(?<!^|,)"(?!,|$)/, '_')

以前的版本没有lookbehind断言。

<强>解释

(?<!^|,)  # Assert that we're not at the start of the line or right after a comma
"         # Match a quote
(?!,|$)   # Assert that we're not at the end of the line or right before a comma

当然,这假设我们不会遇到像

这样的病态案例
"Mary",""Oh," she said"

答案 1 :(得分:2)

如果您不使用Ruby 1.9,或者只是厌倦了正则表达式,请在,上拆分字符串,删除第一个/最后一个引号,用{{1}替换剩余的" } s,重新引用,并加入_

(我们总是不得不担心效率!)

答案 2 :(得分:1)

$str = '"folk"';

$new = str_replace('"', '', $str);

/* now $new is only folk, without " */

答案 3 :(得分:0)

元策略:

可能的情况是手动输入的数据不一致,当人们手动输入字段终止符(双引号)或分隔符(逗号)到字段本身时,CSV会变得混乱。如果您可以重新生成文件,请让他们使用极不可能的字段开始/结束标记,如5代字符(~~~~~),然后您可以拆分“~~~~~,~~~~~ “并且每次都获得正确数量的字段。

答案 4 :(得分:0)

除非您别无选择,否则请使用正确的转义重新生成文件。任何其他方法都要求麻烦,因为未转义的引号的插入是有损的,因此无法可靠地逆转。

如果您无法从源代码中修复文件,那么Tim Pietzcker的正则表达式总比没有好,但我强烈建议您让脚本打印所有“固定”行并手动检查它们是否有错误。