如何从逗号分隔更改为分号分隔,但不更改引号之间的逗号?

如何从逗号分隔更改为分号分隔,但不更改引号之间的逗号?

我有一个逗号分隔的文件,如下所示:

123,456,"ABC,DEF"

我想将文件更改为分号分隔的文件:

123;456;"ABC,DEF"

我运行了以下命令,但不幸的是引号中的 , 也更改为 ;。我怎样才能阻止这种情况发生?

sed 's/,/;/g; s/\"//g; s/$/;^/' input.csv > output.csv

答案1

如何从逗号分隔更改为分号分隔,但不更改引号之间的逗号?

您可以使用csvtool。它已经针对许多发行版进行了打包。使用正则表达式处理 csv 格式既困难又容易出错。

$  csvtool -t ','   -u ';' col 1-  input.csv > output.csv

答案2

您可以使用awk双引号作为字段分隔符,并仅替换,奇数;字段(1、3、5 等)。

awk 'BEGIN{OFS=FS="\""} {for (i=1;i<=NF;i=i+2) gsub(/,/,";",$i)}1' file

这里做了一些假设,比如最初没有;进入字段,"双引号内没有嵌入/转义,但输入很简单,如示例中所示。

为了处理更复杂的情况,GNU awk 提供了一个FPAT 解决方案对于 csv 文件,这在大多数情况下都很有效,但不包括字段中的换行符等情况。如果这个 cvs 不能像示例中那样简单,那么需要一个使用 cvs 解析库的程序。

答案3

使用 GNU awk 进行 FPAT:

$ awk -v FPAT='[^,]*|"[^"]+"' -v OFS=';' '{$1=$1}1' file
123;456;"ABC,DEF"

如果您需要更多,请参阅https://stackoverflow.com/questions/45420535/whats-the-most-robust-way-to-efficiently-parse-csv-using-awk

相关内容