1

data_export_20130206-F.csv という名前の csv ファイルがあります。二重引用符 (") を含むデータが含まれているため、解析が非常に面倒です。

ファイルは次のようになります (ただし、より多くのフィールドがあります)

"stuff","zipcode"
"<?xml version="1.0" encoding="utf-8" ?>","90210"

フィールド内の引用符を「エスケープ」したいので、次のようになります (注: xml 内の引用符は 2 倍になっています)。

"stuff","zipcode"
"<?xml version=""1.0"" encoding=""utf-8"" ?>","90210"

しかし、これを実行すると:

cat data_export_20130206-F.csv| sed -E 's@([^,])(\")([^,])@\1""\3@g'

残念ながら、各行の末尾に二重引用符が追加され、ドキュメントが無効になります。

"stuff","zipcode""
"<?xml version=""1.0"" encoding=""utf-8"" ?>","90210""

csv フィールド内の二重引用符を置き換え、各行の末尾に二重引用符を追加しないようにするにはどうすればよいですか?

4

3 に答える 3

0

これは壊れやすい解決策ですが、提供した入力に対しては機能します。

perl -pe 's/(?:^"|"(?=,)|"$|(?<=,)")//g;s/"/""/g;s/^/"/;s/$/"/;s/(?:(?=,)|(?<=,))/"/g' FILENAME

引用符内のコンマはこれを壊すことに注意してください。入力を指定すると、次の出力が生成されました。

"stuff","zipcode"
"<?xml version=""1.0"" encoding=""utf-8"" ?>","90210"
于 2013-02-08T12:01:16.817 に答える
0

最終的な前に空白がないことを確認してください"。そうしないと、置換が一致します。sed末尾の空白を削除するために使用することもできます:

sed 's/\s\+$//' x.csv | sed -E 's@([^,])(\")([^,])@\1""\3@g'
于 2013-02-07T23:46:26.553 に答える
0

もう 1 つの方法は、2 回目のパスで余分な二重引用符を削除することです。

sed -E 's@([^,])(\")([^,])@\1""\3@g' data_export_20130206-F.csv | sed 's,"\("$\),\1,'

または、単にすべての引用符の繰り返しを押しつぶすことによってtr(ただし、フィールドが引用符で終わると、これは壊れます):

sed -E 's@([^,])(\")([^,])@\1""\3@g' data_export_20130206-F.csv | tr -s '"'

なんらかの理由でまだ改行が取り除かれている場合は、置換時にそれらを readd してください:

sed -E 's@([^,])(\")([^,])@\1""\3@g' data_export_20130206-F.csv | sed 's,""$,"\n,'
于 2013-02-07T23:48:58.890 に答える