我有一些数据目前采用 TSV 格式,但需要转换为 CSV 格式。唯一的问题是,有时在 TSV 中,某些包含逗号的值并不总是位于同一列中(每个实例的逗号数量也可能有所不同)。我想将这些逗号分隔的字符串封装在引号中,以便 CSV 可以正确解析。
我拥有的(TSV):
Freddy, Jasmine, and Lucy 412 Penguin
Maggie 5,432 salad
Joe 4 John Smith, PhD
我想要什么(CSV):
"Freddy, Jasmine, Lucy",412,Penguin
this,"5,432",salad
Joe,4,"John Smith, PhD"
有没有办法在 bash 中做到这一点?
答案1
这csvformat
工具来自CSV套件将会完全按照您的意愿行事:
csvformat --tabs inputFile.dat
例子
printf "%s\n" \
$'Freddy, Jasmine, and Lucy\t412\tPenguin' \
$'Maggie\t5,432\tsalad' \
$'Joe\t4\tJohn Smith, PhD' >inputFile.dat
csvformat --tabs inputFile.dat
输出
"Freddy, Jasmine, and Lucy",412,Penguin
Maggie,"5,432",salad
Joe,4,"John Smith, PhD"
答案2
对于此类事情的另一个有用的工具是磨坊主- 借用@roaima 的输入文件
$ mlr --itsv --ocsv cat inputFile.dat
"Freddy, Jasmine, and Lucy",412,Penguin
Maggie,"5,432",salad
Joe,4,"John Smith, PhD"
答案3
使用与 CSV 模块捆绑在一起的编程语言来执行此操作比 csvkit 或 miller 更详细:
ruby -rcsv -e '
csvin = CSV.new(File.new(ARGV.shift), col_sep: "\t")
csvout = CSV.new($stdout)
csvin.each {|row| csvout.puts(row)}
' file.tsv
或者
ruby -rcsv -e 'CSV.foreach(ARGV.shift, col_sep: "\t") {|row| puts CSV.generate_line(row)}' file.tsv
输出
"Freddy, Jasmine, and Lucy",412,Penguin
Maggie,"5,432",salad
Joe,4,"John Smith, PhD "
您的示例数据的最后一行有一些尾随空格。