从 CSV 文件中删除字符
Posted
技术标签:
【中文标题】从 CSV 文件中删除字符【英文标题】:Removing characters from a CSV file 【发布时间】:2016-11-05 16:48:42 【问题描述】:我有一个 CSV 文件,其中包含从 mysql 表导出的数据。在其中一个字段中,有一个换行符,它将字段“拆分”为 2 行。我正在尝试删除这个换行符,但似乎无法做到。
另外,同一个字段可能包含双引号和逗号,这给我带来了麻烦,当我用"
将字段括起来时,在导出表时用,
终止它们。所以我改用|
来终止字段,并且不要用任何东西包围字段。
当我cat
linux 机器上的文件时,该字段看起来像这样
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
字符串出现在下一行。试试:
$ 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 文件中删除字符的主要内容,如果未能解决你的问题,请参考以下文章