因此,我试图使用load数据本地INFILE将数据加载到MySQL中。大约240万行。
这些行中的一些行在数据中有一个分行符,并且没有被插入。
我们确定的一件事是,实际换行之前的最后一个字符是一个" (双引号),因此我们可以将"旁边的所有换行符更改为类似"***\r\n的其他字符。
这将使我能够添加语句LINES TERMINATED BY '***\r\n',而不仅仅是\r\n。
E.g
输入文件中的一个条目: in.csv (行以\r\n结尾)
1,223,"{...}","Some title with
line breaks"\r\n需要在处理文件后输出
1,223,"{...}","Some title with
line breaks"***\r\n
`另一种方法是删除CSV数据中的所有换行符,并且在行的末尾只有换行。问题是,我不知道如何做到足够快,因为我正在处理非常大的文件(2GB+)
现在,我尝试了失败。我想我漏掉了什么。这是我最近的尝试。
sed ':a;N;$!ba;s/"$/***"\r\n/g' in.csv > out.csv但是,这对我没有用。
谢谢。
***UPDATE***
我意识到所有记录都是通过load数据查询插入的。我不这么认为,因为使用wc-l的行计数与select count(*)不同。
然后我意识到,当wc遇到带有内嵌换行的数据时,它会将它视为一个单独的行,而不是将其视为同一行的一部分。
我感谢大家的努力。
发布于 2020-02-27 09:29:28
下面是一个PHP脚本,可以满足您的需要:
$fin = fopen("input.txt", "r");
$fout = fopen("output.txt", "w");
while(!feof($fin)) {
$line = preg_replace("/(?<!\")\r?\n/", "", fgets($fin));
fwrite($fout, $line);
}
fclose($fin);
fclose($fout);该解决方案使用regex模式的(?<!\")\r?\n目标CR?LF,只有当它没有立即遵循双引号。
发布于 2020-02-27 09:40:46
您需要记住,$只与换行符、LF、char匹配。换行线前还有一辆马车。
因此,您需要确保在换行符之前或在CRLF之前匹配":
sed -E ':a;N;$!ba;s/"\r?$/***"\r\n/g' in.csv > out.csv在这里,POSIX "\r?$模式匹配一个"字符,然后是一个可选的回车,然后断言字符串末尾的位置。
带有CRLF结尾的UTF8编码文本文件的测试

收益率

https://stackoverflow.com/questions/60429858
复制相似问题