【发布时间】:2020-03-19 19:29:12
【问题描述】:
我需要将 CSV 文件输入数据库。为此,我必须删除“狂野”的未转义引号。
以下输入结构是可能的:
"aa";"bb";"cc";"dd";"ee"
"aa";"bb";"c "cc" c";"dd";"ee"
"aa";;"cc";"dd";"ee"
"aa";55;"cc";"dd";"ee"
表达式:
(?<!^|\"\;)\"(?!\;|$)
确实适用于输入示例中的#1 和#2,但当存在空元素 (#3) 或未加引号的数字字段 (#4) 时会失败。另见this Rubular example
任何关于如何涵盖这些案例的指针将不胜感激。
编辑:
按照@Wiktor Stribiżew 的建议,我现在正在使用
(^"|"$|";+"|";\d+;"|";|;")|"
这也涵盖了一些额外的边缘情况,我在输入数据中已经确定,如图here
【问题讨论】:
-
好吧,我猜这将匹配未转义的 qoutes
(?<!\\)",但不确定您的预期输出是什么。 -
我需要在列的开头和结尾保留“文本限定符”引号,但在列的其余部分去掉引号
-
根据您的要求,您可以使用正则表达式替换方法搜索
(^"|"$|";+"|";\d+;")|"并替换为$1/\1。见regex101.com/r/suDXQz/1 -
与其乱搞 CSV,我建议修复任何输出此文件的程序,您可以在其中修改引用行为以使其不那么激进。此外,第 2 行很可能在第 3 列中包含引号字符,并且这里没有正确转义。
-
@WiktorStribiżew 非常感谢,运行良好。如果您将其发布为答案,我可以接受