转换分隔符字符,同时转义字段中的分隔符

转换分隔符字符,同时转义字段中的分隔符

我有一个文本文件,其中的字段由|.我想将其转换为,典型的 CSV。我尝试过使用这个:

sed 's/|/,/g' test.txt > test.csv

但有些字段中已经有逗号。例如:

var1|var2|var3
Potter, Harry|2|3

我应该怎么办?

答案1

使用正确的 csv 解析器工具:

csvtool -t '|' -u ',' cat infile > outputfile
var1,var2,var3
"Potter, Harry",2,3

csvtool --help

-t   Input separator char.  Use -t TAB for tab separated input.
-u   Output separator char.  Use -u TAB for tab separated output.
cat
    This concatenates the input files together and writes them to
    the output.  You can use this to change the separator character.  

答案2

仅引用包含逗号的值:

$ sed 's/[^|]*,[^|]*/"&"/; y/|/,/' <infile
var1,var2,var3
"Potter, Harry",2,3

如果输入已包含双引号字符,并且它们未用于 CSV 格式(例如Riddle, Tom "Voldemort"|4|5),则对于大多数 csv 格式,您可以使用以下命令转义它们""

$ sed 's/"/""/g; s/[^|]*[,"][^|]*/"&"/; y/|/,/' <infile
"Riddle, Tom ""Voldemort""",4,5

答案3

尝试这个

sed 's/|/","/g; s/^/"/; s/$/"/' file 

这将产生如下输出:

"var1","var2","var3"
"Potter, Harry","2","3"

解释:

您需要使用引号将每一列括起来""

  • 首先s/|/","/g将所有内容替换|","引号中的逗号输出: var1","var2","var3 Potter, Harry","2","3

  • 第二个s/^/"/用引号替换行的开头,其中^意味着行的开头

  • 第三个s/$/"/用引号替换行尾,其中$意味着行尾

您还可以在每个逗号之前使用反斜杠转义字段中的逗号,如下所示

Potter\, Harry,2,3

您可以在此处阅读有关 csv 格式的更多信息:https://www.csvreader.com/csv_format.php

答案4

您可以修改正则表达式以包含 \w,witch 匹配任何字母数字和 _ 后跟 |

 #sed 's/\w|/,/g' example.csv 
 var1|var2|var3
 Potter, Harry|2|3

相关内容