囲む引用符に加えて、文字列の間に二重引用符があります。

囲む引用符に加えて、文字列の間に二重引用符があります。

リクエストがあります。

私のCSVファイルに文字列があり、引用符を削除せずに"Testurteil "sehr gut""ファイルをロードする必要があります。redisまたは私はこれが欲しい:Testurteil "sehr gut"閉じる引用符があっても構いません。

答え1

努力する:

perl -pi.back -le 's/"(?:[^"]|"(?=[^,]))*"|[^",]*/($r=$&)=~
  s@(^"|"$|\\.)|"@$1||"\\\""@ge;$r/ge' file.csv

経験的な方法を使用して、文字を囲む二重引用符文字を識別し、バックスラッシュでエスケープします。

たとえば、次のように変更されます。

 "asd","","a,b"c,d"e,f",""",,blah

到着する:

 "asd","","a,b\"c,d\"e,f","\"",,blah

(原本はそのままにしてくださいfile.csv.back

エスケープの代わりに一重引用符に変更するには:

perl -pi.back -le 's/"(?:[^"]|"(?=[^,]))*"|[^",]*/($r=$&)=~
  s@(^"|"$|\\.)|"@$1||"'\''"@ge;$r/ge' file.csv

答え2

たぶんこんなことはありませんか?

cat test.csv
17,"abc","Testurteil "sehr gut"","08/15"
99,"xyz","Testurteil "vernichtend"","4711"

すべての行のすべてのフィールドを印刷します(検証用のみ)。

awk -F, '{print $0}' test.csv
17,"abc","Testurteil "sehr gut"","08/15"
99,"xyz","Testurteil "vernichtend"","4711"

awkコマンドラインオプション "-F"を使用すると、標準のスペースとは異なるフィールド区切り文字を設定できます。

「特殊フィールド」のみを印刷します。つまり、すべての行に対してフィールド番号3を印刷します。

awk -F, '{print $3}' test.csv
"Testurteil "sehr gut""
"Testurteil "vernichtend""

より読みやすくするために、いくつかの説明があります(またはキー:値ストアにエクスポート)。

awk -F, '{print "Line" FNR ":field3 " $3}' test.csv 
Line1:field3 "Testurteil "sehr gut""
Line2:field3 "Testurteil "vernichtend""

CSVファイルを使用する追加フ​​ィールド:

awk -F, '{print "Line number " FNR ": " $3 " for product "$1}' test.csv
Line number 1: "Testurteil "sehr gut"" for product 17
Line number 2: "Testurteil "vernichtend"" for product 99

関連情報