用竖线 | 替换逗号,双引号内除外,并删除双引号

Juh*_*han 7 shell sed shell-script csv

文件 1

12584,"Capital of America, Inc.",,HORIZONCAPITAL,USA,......etc
25841,"Capital of America, Inc.",,HORIZONCAPITAL,USA,......etc
87455,"Capital of America, Inc.",,HORIZONCAPITAL,USA,......etc
Run Code Online (Sandbox Code Playgroud)

输出

12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
Run Code Online (Sandbox Code Playgroud)

我有一个 csv 文件,我必须将其转换为用管道(|)分隔的文本文件我已经完成了 shell 脚本 sed 's/^/"/;s/,/|/g;s/$/"/' $File > $Output

但问题在于“美国资本公司”这一领域。包含一个逗号,也用竖线 (|) 代替。所以我只想用管道替换所有内容,除了不在值内的值被赋予双引号“”。

是否有任何shell脚本可以做到这一点?

Kus*_*nda 22

使用csvkit

$ csvformat -D '|' file.csv
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
Run Code Online (Sandbox Code Playgroud)

csvkit是用 Python 编写的 CSV 操作/查询工具的集合。这些进行正确的 CSV 解析,csvformat并可用于用任何其他字符替换默认的逗号分隔符。该实用程序将确保根据 CSV 规则正确引用结果。


ste*_*ver 8

至少在基于 Debian 的系统上,您应该能够安装基于 OCaml 的 csvtool

$ csvtool -u '|' cat file.csv
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
Run Code Online (Sandbox Code Playgroud)

你也可以使用 Perl 的Text::CSV模块:

$ perl -MText::CSV -lne '
  BEGIN{$p = Text::CSV->new()} 
  print join "|", $p->fields() if $p->parse($_)
' file.csv
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
Run Code Online (Sandbox Code Playgroud)