regex - 如何在 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
解决方案
Perl 的环视断言来拯救!
perl -pe 's/(?<=[^;])"(?=[^;\n])/""/g'
即,如果 a"
前面没有 a;
并且后面没有 a ;
,则将其替换为""
.
推荐阅读
- javascript - 如何从对象中的所有键中获取特定值并将其存储在数组中?
- python - Python - 使用 pyaudio 从 http mp3 流中读取
- shopify - 自定义特定产品标签的结帐 - 首次亮相主题
- reactjs - 期望 SWR 库返回缓存数据但没有发生
- android - 带有 TypeConverter 的房间中的 @Query
- android - 如何将字符串从 Android 应用程序发送到 Web 服务器上的 API。并返回 API 的输出。(阅读描述以获得更好的解释)
- reactjs - 如何添加未封闭的 JSX 标签?
- python - 迭代python中的张量
- laravel - 如何在 laravel 中合并两个雄辩的查询?
- r - 用于从基础“词典”中替换和添加数据集中列的函数