カンマで区切られ、二重引用符で囲まれた CSV 内の間隔の二重引用符を削除します。

カンマで区切られ、二重引用符で囲まれた CSV 内の間隔の二重引用符を削除します。

おそらく私は運が悪いのでしょう。二重引用符で囲まれたコンマ区切りの 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",""

参照awk を使用して csv を効率的に解析する最も堅牢な方法は何ですか

関連情報