我有一个包含数百万行的 csv 文件。这是我用来加载数据的命令
load data local infile 'myfile' into table test.mytable
fields terminated by ',' optionally enclosed by '"'
lines terminated by '\n' ignore 1 lines
除了双引号字符串内有双引号的某些行之外,这几乎可以满足所有要求。如
"first column",second column,"third column has "double quotes" inside", fourth column
它截断第三列并发出警告,因为该行不包含所有列的数据。
感谢您的帮助
最佳答案
CSV 已损坏。 MySQL 或任何程序都无法导入它。如果在列内,则需要对双引号进行转义。
您可以使用脚本修复 CSV。如果引号前面或后面没有逗号,则它可能是文本的一部分,应该转义。
以下正则表达式将执行 negative lookbehind and lookahead查找前面或后面没有引号的引号。
/(?<!^)(?<!,)(\s*)"(\s*)(?!,)(?!$)/
See it on regex101
<小时/>在命令上可以运行
perl -pe 's/(?<!,)(?<!^)(\s*)"(\s*)(?!,)(?!$)/\1\\"\2/g' data.csv > data-fixed.csv
<小时/>
请注意,此方法并非万无一失。如果双引号后面确实有逗号,但它是文本的一部分,则您几乎无法修复 CSV。在这种情况下,脚本根本无法知道它是否是列分隔符。
关于MySQL Load data infile -- 双引号中的双引号值如 "a "double"quoted value",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43229357/