在格式错误的.csv文件中,有一行数据带有额外的双引号,例如最后一行:
Name,Comment
"Peter","Nice singer"
"Paul","Love "folk" songs"
如何删除folk
周围的双引号并将字符串替换为:
Name,Comment
"Peter","Nice singer"
"Paul","Love _folk_ songs"
答案 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的正则表达式总比没有好,但我强烈建议您让脚本打印所有“固定”行并手动检查它们是否有错误。