首页 > 解决方案 > 如何在 CSV 中转义双引号?

问题描述

我目前有几个 csv 文件,我无法控制它们的创建方式。不用说……它们格式不正确,不符合 RFC 4180。

示例输入:要点

",0000000000000000";"0";"1115S021121-12-1/2"M"
",0000000000000000";"0";"1115S021122-12-1/2"M"
",0000000000000000";"0";"1115S021123-12-1/2"M"
",0000000000000000";"0";"1115S021124-12-1/2"M"
"1";"1";"EXAMPLE_RANDOM" .    STRING"
"2,0000000000000000";"2";"this;can"also happen"

想要的:

",0000000000000000";"0";"1115S021121-12-1/2""M"

我一直在尝试通过使用正则表达式运行 sed 来修复它。但是我只有正则表达式的基本知识,sed 不想在我的尝试中表现得很好。

有人可以帮我避开双引号内的英寸引号“吗?我知道这样的解决方案只有 99%,我只能依靠以下事实。

这意味着一个 ; 或“可能出现在引用的字段中。有人可以帮我用“”替换“吗?

我尝试将几个stackoverflow帖子结合起来的正则表达式。

 sed -E "s/[^\"](?<!;)\"(?!;|$)/\1"/g" $filename.test2   -> error
 sed "s/[^\"](?<!;)(\")(?!;|$)/\1/g" $filename.test2    -> error 
 ... about 10 more variations, some even without errors but no replaced strings.

如果有人有其他解决方案而不是正则表达式,非常感谢任何帮助!

编辑:感谢@choroba perl wizzard。以下修复了该文件。

 cat $filename.test | perl -pe 's/(?<=[^;])"(?=[^;])/""/g' >  $filename.test2

标签: regexunixsed

解决方案


Perl 的环视断言来拯救!

perl -pe 's/(?<=[^;])"(?=[^;\n])/""/g' 

即,如果 a"前面没有 a;并且后面没有 a ;,则将其替换为"".


推荐阅读