![转换分隔符字符,同时转义字段中的分隔符](https://linux22.com/image/133802/%E8%BD%AC%E6%8D%A2%E5%88%86%E9%9A%94%E7%AC%A6%E5%AD%97%E7%AC%A6%EF%BC%8C%E5%90%8C%E6%97%B6%E8%BD%AC%E4%B9%89%E5%AD%97%E6%AE%B5%E4%B8%AD%E7%9A%84%E5%88%86%E9%9A%94%E7%AC%A6.png)
我有一个文本文件,其中的字段由|
.我想将其转换为,
典型的 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