二重引用符を削除し、その中のカンマを置き換えます。

二重引用符を削除し、その中のカンマを置き換えます。

CSV形式のファイルから二重引用符を1つずつ削除し、その中のカンマを空白に置き換えて、フィールド全体を1つに見えるようにするコマンドを探しています。

例:csvの1列の下に""Wembley,London""表示されます。Wembley London

また、「Wembley、London」の救いはWembley Londonである。スクリプトは、フィールドの位置に関係なくファイルを読み込みます。

次のコマンドを試しましたが、うまくいきませんでした。

sed 's/\"//g' $fname >  $Target/sample_UPS1.csv
sed 's/\,/ /g' $Target/sample_UPS1.csv >  $Target/sample_UPS1.csv

awk -F'""' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", " ", $i) } 1' $fname | sed 's/\"//g'   > $Target/sample_UPS.txt ##For removal of two double quotes and substitution of comma with a space##

awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", " ", $i) } 1' $Target/sample_UPS.txt | sed 's/\"//g' > $Target/sample_UPS1.txt ##For removal of double quotes and substitution of comma with a space##

どちらの場合も、Sample_ups1は私の出力ファイルです。

答え1

有効なCSVがある場合は、適切なCSVパーサーを使用する必要があります。 Rubyは使いやすいです:if

cat file.csv
"""Wembley,London""",a,"b","c, ""d e"", ""f,g"",h"

それから

ruby -e '
    require "csv"
    data = CSV.read ARGV.shift
    data.each {|row| 
        row.each {|field| field.delete! "\""; field.tr! ",", " "}
        puts CSV.generate_line row
    }
' file.csv
Wembley London,a,b,c  d e  f g h

CSVフィールドには引用符が含まれています。二重見積もりをリクエスト。お持ちの場合

""Wembley,London"","other stuff",...

その場合、CSVの形式が正しくありません。

答え2

真珠テキスト::CSVモジュールは、次の種類の誤ったCSVを処理できます。

CSVデータが本当に悪い場合。

1,"foo "bar" baz",42

または

1,""foo bar baz"",42

このデータ行を解析し、引用符付きフィールド内で引用符を残す方法はありますか?これは、以下のように設定して保証するallow_loose_quotesことで達成できます。escape_charquote_char

例えば

echo 'a,b,c,1234,23,""Wembley,London"",267,agty' | 
  perl -MText::CSV -lne '
    BEGIN{$p = Text::CSV->new( {allow_loose_quotes => 1, escape_char => "\\"} )} 
    print join ",", map { s/,/ /g; s/"//g; $_ } $p->fields() if $p->parse($_)
'
a,b,c,1234,23,Wembley London,267,agty

関連情報