ファイル1
12584,"Capital of America, Inc.",,HORIZONCAPITAL,USA,......etc
25841,"Capital of America, Inc.",,HORIZONCAPITAL,USA,......etc
87455,"Capital of America, Inc.",,HORIZONCAPITAL,USA,......etc
出力
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
csvファイルがあり、パイプ(|)で区切られたテキストファイルに変換する必要があります。シェルスクリプトを完了しました。sed 's/^/"/;s/,/|/g;s/$/"/' $File > $Output
ところが問題は「US Capital Corporation」分野だ。カンマが含まれており、パイプ(|)に置き換えられます。だから私はすべてをパイプに置き換えたいのですが、値の中に二重引用符 ""を与えません。
これを実行できるシェルスクリプトはありますか?
答え1
使用csvkit
:
$ csvformat -D '|' file.csv
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
csvkit
Pythonで作成されたCSV操作/クエリツールバー。正しいCSV解析が可能で、デフォルトのcsvformat
カンマ区切り文字を別の文字に置き換えるために使用できます。このユーティリティは、結果がCSVルールに従って正しく引用されていることを確認します。
答え2
少なくともDebianベースのシステムでは、OCamlベースをインストールできる必要があります。csvtool
$ csvtool -u '|' cat file.csv
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
Perlモジュールを使用することもできますText::CSV
。
$ perl -MText::CSV -lne '
BEGIN{$p = Text::CSV->new()}
print join "|", $p->fields() if $p->parse($_)
' file.csv
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
答え3
問題を解決するには:
awk 'BEGIN{FS=",";OFS="|";} {print $1,$2","$3,$4,$5,$6,$7}' Test | tr -d \"
このような一般的な質問については、awk
GNUFPATフィールドを記述する特殊変数:
awk -vFPAT='[^,]*|("[^"]*")' -vOFS='|' '{$1=$1;print}' Test | tr -d \"
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
awk
とツールを使用すると、追加のsed
ソフトウェアパッケージは必要ありません。
編集する
〜のようにイサク述べたように、答えを更新します。
awk -vFPAT='[^,]*|(["].*["])' -vOFS='|' '{print $1,$2,$3,$4,$5,$6}' Test | sed 's/\"//g'
答え4
独立性perl
:
perl -pe 's{"(.*?)"|,}{$1 // "|"}ge' < "$File" > "$Output"
(値に改行文字が含まれていないと仮定します。|
)"