CSVファイルの処理 - 引用符を削除し、カンマ区切り文字をタブに置き換えます。

CSVファイルの処理 - 引用符を削除し、カンマ区切り文字をタブに置き換えます。

区切りファイルを変換するにはシェルコマンドが必要です。入力ファイルは二重引用符と二重引用符のない2つのバリエーションで受信され、両方のファイルは区切り文字でコンマがありました。要件は、カンマをTABに置き換えて引用符を削除することです(ファイルに二重引用符がある場合)。それ以外の場合は、カンマを変更するだけです。ファイルフィールドに変換中に無視する必要があるカンマも含まれている場合、ファイルは引用符で送信されます。 単一のコマンドは、RHEL 6.x環境のAwk 3.xで動作する必要があります。

例えば。二重引用符付きファイル1:

"Jhon","Carpenter","CA,TX,NJ"
"Mike","Painter","WA,GA,MI"

変換後はタブで区切る必要があります。

Jhon   Carpenter   CA,TX,NJ 
Mike   Painter     WA,GA,MI 

例えば。二重引用符のないファイル 2:

EMP1,123456,CA 
EMP2,456789,TX 

変換後はタブで区切る必要があります。

EMP1 123456   CA 
EMP2   456789   TX

答え1

使用csvkit:

$ csvformat -T file1.csv
Jhon    Carpenter       CA,TX,NJ
Mike    Painter WA,GA,MI

$ csvformat -T file2.csv
EMP1    123456  CA
EMP2    456789  TX

出力がfile1.csv少し間違っているように見えますが、これはタブが正しく整列していないためです。すべての列の間にタブがあります。

CSVKitは、さまざまなCSV関連のシェルユーティリティを含むPythonベースのツールキットです。正しいCSV解析を実行し、CSVファイルをクエリ、フォーマット、変換するために使用できます。

たとえば、最初のファイルに正しいヘッダーがある場合は、それをJSONに変換するのは簡単です。

$ csvjson file1.csv
[{"First": "Jhon", "Last": "Carpenter", "Stuff": "CA,TX,NJ"}, {"First": "Mike", "Last": "Painter", "Stuff": "WA,GA,MI"}]

答え2

この短いsedスクリプトは両方のタイプのファイルを処理できます(最初のタイプと2番目のタイプを含む混合ファイルも含みます)。

sed '/"/!s/,/\t/g;s/","/\t/g; s/"//g'

繰り返されない式をグループ化しないので、スクリプトよりはるかに高速です。

sedGNUがあるのでうまくいくようです\t。それ以外の場合は、代わりにリテラルTABを使用してください。

答え3

いくつかの方法:

(二重引用符を使用file1):

-アッ方法:

awk -F'"' '{ r=""; for(i=1;i<NF;i++) 
     if ($i~/^[[:alnum:]]/) r=(r!="")? r OFS $i : $i; print r }' OFS='\t' file1

-sed方法:

sed 's/","/\t/g; s/"//g;' file1

出力(両方の方法):

Jhon    Carpenter   CA,TX,NJ
Mike    Painter WA,GA,MI

----------

file2二重引用符を除く) -tr次のコマンドを適用すれば十分です。

tr ',' '\t' <file2

出力:

EMP1    123456  CA
EMP2    456789  TX

----------

条件への統一されたアプローチ」両方のファイル形式に対して同じコマンドで十分でなければなりません。":

awk -v quoted=$(grep -cm1 '"' file1) 'BEGIN{ FS=(quoted)? "\"" : ","; }
     { r=""; for(i=1;i<=NF;i++) if(!quoted || $i~/^[[:alnum:]]/) r=(r!="")? r OFS $i : $i; 
             print r }' OFS='\t' file1

答え4

CSVデータには適切なCSVパーサが必要です。私は Kusarananda の答えが好きです。 csvモジュールと一緒にRubyなどの言語を使用することもできます。

ruby -rcsv -e '
  out = CSV.new($stdout, {:col_sep => "\t"})
  CSV.foreach(ARGV.shift) {|row| out << row} 
' file1.csv

関連情報