おそらく私は運が悪いのでしょう。二重引用符で囲まれたコンマ区切りの CSV ファイルには、有効なテキスト内に二重引用符とコンマが含まれているからです。
そこで、これを次のように変更します。
"record 1","name 1","text 1, text 2"
"record 2","name ""2""","text 2"
"record 3","name 3",""
それについて:
"record 1","name 1","text 1, text 2"
"record 2","name 2","text 2"
"record 3","name 3",""
name ""2""
から二重引用符を削除しましたname 2
が、行番号 3 の二重引用符はそのまま残していることに注意してください。,""
答え1
を使用してcsvformat
区切り文字をタブ ( csvformat -T
) に変換し、二重引用符 ( tr -d '"'
) を削除してから、区切り文字をコンマに戻して、すべてのフィールドを引用符で囲みます (パイプラインの最後の部分)。
$ csvformat -T file.csv | tr -d '"' | csvformat -t -U1
"record 1","name 1","text 1, text 2"
"record 2","name 2","text 2"
"record 3","name 3",""
csvformat
の一部であるcsvkit
。
答え2
これは、入力にどの文字が含まれていても機能します (引用符で囲まれたフィールド内の改行を除くが、これはまったく別の問題です)。
FPAT 用の GNU awk を使用する場合:
$ awk -v FPAT='("[^"]*")+' -v OFS='","' '{
for ( i=1; i<=NF; i++ ) {
gsub(/"/,"",$i)
}
print "\"" $0 "\""
}' file
"record 1","name 1","text 1, text 2"
"record 2","name 2","text 2"
"record 3","name 3",""
または任意のawkで同等のもの:
$ awk -v OFS='","' '{
orig=$0; $0=""; i=0;
while ( match(orig,/("[^"]*")+/) ) {
$(++i) = substr(orig,RSTART,RLENGTH)
gsub(/"/,"",$i)
orig = substr(orig,RSTART+RLENGTH)
}
print "\"" $0 "\""
}' file
"record 1","name 1","text 1, text 2"
"record 2","name 2","text 2"
"record 3","name 3",""