首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用sed ()将所有\r\n替换为行转义序列的另一端?

问如何使用sed ()将所有\r\n替换为行转义序列的另一端?
EN

Stack Overflow用户
提问于 2020-02-27 09:19:51
回答 2查看 74关注 0票数 2

因此,我试图使用load数据本地INFILE将数据加载到MySQL中。大约240万行。

这些行中的一些行在数据中有一个分行符,并且没有被插入。

我们确定的一件事是,实际换行之前的最后一个字符是一个" (双引号),因此我们可以将"旁边的所有换行符更改为类似"***\r\n的其他字符。

这将使我能够添加语句LINES TERMINATED BY '***\r\n',而不仅仅是\r\n。

E.g

输入文件中的一个条目: in.csv (行以\r\n结尾)

代码语言:javascript
复制
1,223,"{...}","Some title with

line breaks"\r\n

需要在处理文件后输出

代码语言:javascript
复制
1,223,"{...}","Some title with

line breaks"***\r\n
`

另一种方法是删除CSV数据中的所有换行符,并且在行的末尾只有换行。问题是,我不知道如何做到足够快,因为我正在处理非常大的文件(2GB+)

现在,我尝试了失败。我想我漏掉了什么。这是我最近的尝试。

代码语言:javascript
复制
sed ':a;N;$!ba;s/"$/***"\r\n/g' in.csv > out.csv

但是,这对我没有用。

谢谢。

***UPDATE***

我意识到所有记录都是通过load数据查询插入的。我不这么认为,因为使用wc-l的行计数与select count(*)不同。

然后我意识到,当wc遇到带有内嵌换行的数据时,它会将它视为一个单独的行,而不是将其视为同一行的一部分。

我感谢大家的努力。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-27 09:29:28

下面是一个PHP脚本,可以满足您的需要:

代码语言:javascript
复制
$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,只有当它没有立即遵循双引号。

票数 1
EN

Stack Overflow用户

发布于 2020-02-27 09:40:46

您需要记住,$只与换行符、LF、char匹配。换行线前还有一辆马车。

因此,您需要确保在换行符之前或在CRLF之前匹配":

代码语言:javascript
复制
sed -E ':a;N;$!ba;s/"\r?$/***"\r\n/g' in.csv > out.csv

在这里,POSIX "\r?$模式匹配一个"字符,然后是一个可选的回车,然后断言字符串末尾的位置。

带有CRLF结尾的UTF8编码文本文件的测试

​

​

收益率

​

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60429858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档