現在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 "
サンプルデータの最後の行には末尾のスペースがあります。