仅将逗号分隔的字符串封装在引号中

仅将逗号分隔的字符串封装在引号中

我有一些数据目前采用 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  "

您的示例数据的最后一行有一些尾随空格。

相关内容