
CSV 形式のファイルから 1 つまたは 2 つの二重引用符を削除し、その中のコンマをスペースに置き換えて、フィールド全体が 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のパーサーは簡単に使用できます。
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
このデータ行を解析して、引用符で囲まれたフィールド内の引用符をそのまま残す方法があります。これは、ANDを設定し、が次の値と等しくない
allow_loose_quotes
ことを保証することで実現できます。escape_char
quote_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