【问题标题】:Removing characters from a CSV file从 CSV 文件中删除字符
【发布时间】: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//'

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

【问题讨论】:

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

标签: mysql bash csv sed


【解决方案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','')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 2018-07-29
    • 2019-11-17
    • 2013-03-22
    相关资源
    最近更新 更多