二重引用符で囲まれたカンマ区切りの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を効率的に解析する最も強力な方法は何ですか。