カンマを縦棒で置き換え(二重引用符を除く)、二重引用符を削除します。

カンマを縦棒で置き換え(二重引用符を除く)、二重引用符を削除します。

ファイル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

csvkitPythonで作成された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 \"

このような一般的な質問については、awkGNUFPATフィールドを記述する特殊変数:

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"

(値に改行文字が含まれていないと仮定します。|"

関連情報