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""toから二重引用符を削除しましたが、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 -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を効率的に解析する最も強力な方法は何ですか

関連情報