【问题标题】:Shell script - to change delimiter from comma to pipe in .csv fileShell 脚本 - 将 .csv 文件中的分隔符从逗号更改为管道
【发布时间】:2018-05-08 10:40:18
【问题描述】:

我有一个 shell 脚本可以从表中获取数据并将其放入 .csv 文件中。我得到的数据是制表符分隔的,我使用了sed 's/\t/,/g'。这可行,但我所拥有的数据的值中偶尔也会出现逗号,例如“abc,def”。

现在,当我打开 .csv 文件时,考虑到逗号,此值被拆分并移至下一列,现在“abc”在一个列中,“def”在另一列中。

我该如何处理这个问题并让带有逗号的值按原样显示?或者我可以将逗号转换为管道符号 (|) 并使 .csv 将管道符号识别为分隔符吗?

【问题讨论】:

  • 这取决于您用来打开 csv 的程序。
  • 对不起,我不明白你的答案,我是新手,你的意思是 csv 在哪个编辑器中打开?目前它在 Excel 中打开。
  • 保留原来的标签怎么样?大多数 CSV 读取程序(如电子表格程序等)都可以配置为接受制表符作为分隔符(以及逗号、分号,甚至可能是管道符号)。换句话说:为什么你想用别的东西替换标签?
  • 感谢您的回复,如果您能帮助我了解如何使 csv 读取程序将制表符识别为分隔符,这将很有帮助,因为现在它没有将制表符识别为分隔符,因此所有数据都放在单个列。

标签: shell csv


【解决方案1】:

最好使用sed 's/\t/|/g' 并使.csv 将管道符号识别为分隔符。这将解决您的问题。

第二个选项:-

首先将, 改为;,然后将所有标签\t 替换为逗号,。与您的客户核实他们是否对此提议感到满意。

【讨论】:

  • 这不是 OP 提议的吗?
  • @Alfe 不完全是我建议他用管道替换标签。他要求用管道替换, coma,这会造成更多问题,因为他的一些值包含带有 coma 的文本。
  • 对,不完全是。但是他已经提议使用管道符号,并且他已经提议了sed 脚​​本。嗯……
  • 我可以让 .csv 文件将管道符号识别为 shell 脚本本身的分隔符吗?因为一旦创建了 .csv 文件,它就会上传到服务器,并且无法手动更改任何内容。
  • .csv 文件将仅包含使用特定分隔符的数据。由用户(阅读程序)正确解释该分隔符。 .csv 文件本身并没有(确定?)它的分隔符是什么。
【解决方案2】:

如果您的目标程序只是 Excel,那么在值周围加上双引号将起作用“abc,def”。已经讨论过here

"abc,def",ghi,ijk,lmn # this works with spreadsheet

我已经尝试过使用虚拟数据的 sed 命令并且它可以工作。希望这也适用于您的真实数据。

jmaster:~/hackerrank$ cat -T test # below ^I are nothing but tab space
abc,def^Ighi^Ijkl^Imnm
abc,def^Ighi^Ijkl^Imnm
abc,def^Ighi^Ijkl^Imnm

jmaster@jenkins-master:~sed -e 's/\([^\t]*,[^\t]*\)/"&"/g' -e 's/\t/,/g' test
"abc,def",ghi,jkl,mnm
"abc,def",ghi,jkl,mnm
"abc,def",ghi,jkl,mnm

【讨论】:

    【解决方案3】:

    感谢大家的回复。我发现使用“sep = |”在 csv 文件的第一行中将告诉 excel 考虑 |(管道)作为分隔符。我在我的 shell 脚本中包含代码以将第一行插入为“sep =”(在我的情况下为选项卡)。现在当我在 excel 中打开 .csv它以制表符作为分隔符并在各个列中正确分配值。

    【讨论】:

      猜你喜欢
      • 2019-05-21
      • 2020-02-02
      • 2022-11-17
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      相关资源
      最近更新 更多