从 CSV 文件中删除字符

Posted

技术标签:

【中文标题】从 CSV 文件中删除字符【英文标题】:Removing characters from a CSV file 【发布时间】:2016-11-05 16:48:42 【问题描述】:

我有一个 CSV 文件,其中包含从 mysql 表导出的数据。在其中一个字段中,有一个换行符,它将字段“拆分”为 2 行。我正在尝试删除这个换行符,但似乎无法做到。

另外,同一个字段可能包含双引号和逗号,这给我带来了麻烦,当我用" 将字段括起来时,在导出表时用, 终止它们。所以我改用| 来终止字段,并且不要用任何东西包围字段。

当我catlinux 机器上的文件时,该字段看起来像这样

13"\
58,20,"3

该字段应该是什么样子的

13"58,20,"3

当我使用 vi “十六进制编辑器” (:%!xxd) 检查该行的十六进制值时,我得到

31 33 22 5c 0a 35 38 2c 32 30 2c 22 33

我尝试使用 sed

sed -e 's/\\\n//'

sed -e 's/\x5c\x0a//'

删除换行符,但他们没有工作。如何将字段格式化为应有的样子?

【问题讨论】:

这些似乎可能是相关的:***.com/questions/356578/… 您的原始数据是什么样的? 在 mysql 中,该字段看起来像这样13"<newline>58,20,"3 仅表示58,20,"3 字符串出现在下一行。 【参考方案1】:

试试:

$ sed '/\\$/N; s/\\\n//' file
13"58,20,"3

/\\$/ 选择以\ 结尾的行。对于这些行,我们读取下一行(命令N),然后我们进行替换以删除不需要的\ 和换行符:s/\\\n//

不以\ 结尾的行将原封不动地通过。

这种方法假设连续行只连续一次。如果有两个或多个延续的行,我们需要一个循环。

【讨论】:

这在大多数情况下都有效。但由于某种原因,有几行在第一个双引号之后仍然被分割,相同的\\\n @Rayne 好的。这些线有什么不同?这些行的 `` 后面有空格吗?还有什么? 不,它们是相同的,包含\x5c\x0a 顺便说一句,有这个换行问题的字段不是最后一列,它在中间的某个地方,所以我改用sed '/\\/N; s/\\\n//' 你能给我看一个这个代码不起作用的一系列行的例子吗?【参考方案2】:

在 MySQL 端处理此问题的一个选项是使用 REPLACE() 并从包含它们的列(或列)中删除换行符:

SELECT REPLACE(col, '\n', '')
FROM yourTable
INTO OUTFILE '/output.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

【讨论】:

这似乎对我不起作用。我在SELECT *, REPLACE(col, '\n', '') 中包含了一个*,否则它只会返回该字段。但是,字段值仍然是拆分的。 您要导出哪些字段?将它们连同被替换的一起列出。 在同一个 REPLACE 语句中?我试过SELECT REPLACE(col1, col2, col3, col4, col5, '\n', ''),它在“col4,col5”返回了一个关于语法错误的错误。我不认为 REPLACE 期望超过 3 个参数。 @Rayne 不,REPLACE 一次只写一列。 我有 16 列,我不认为有 16 个 REPLACE 是优雅的方式吗?【参考方案3】:

我遇到了同样的问题,使用 HEX 函数显示我在字段 CHAR(13) 和 CHAR(10) 的末尾有 2 个字符 - CR 和 LF 所以解决方案是替换这两个字符 - 即

REPLACE(REPLACE(邮编,'\r',''),'\n','')

【讨论】:

以上是关于从 CSV 文件中删除字符的主要内容,如果未能解决你的问题,请参考以下文章

从数据文件中删除非 ASCII 字符

从字符串中删除字符

是否有一个 Spring 函数可以删除 CSV 文件中的引号字符或分隔符?

在 Perl 中,如何从文件中删除 ^M?

从Python中的字符串中删除奇怪的隐藏字符

bash方法从csv文件中删除最后4列