カンマで区切られた文字列のみを引用符で囲みます。

カンマで区切られた文字列のみを引用符で囲みます。

現在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  "

サンプルデータの最後の行には末尾のスペースがあります。

関連情報