CSVファイルの文字列値でコンマを処理する

CSVファイルの文字列値でコンマを処理する

数値列と文字列列を含むカンマ区切りのファイルがあります。文字列列は引用符で囲まれており、引用符の間にカンマがある場合があります。列を識別する方法はFS =","

サンプル記録

"prabhat,kumar",19,2000,"bangalore,India"

存在するAWKしなければならない

$1 = "prabhat,kumar"
$2 = 19
$3 = "2000"
$4 = "bangalore,india"

設定FS=","によって問題が発生します。

入力は次のとおりです

"prabhat,kumar",19,2000,"bangalore,India","ABC,DEF","GHI",123,"KLM","NOP,QRS"
"prabhat,kumar",19,2000,"bangalore,India","ABC,DEF","GHI",123,"KLM","NOP,QRS"

出力は次のようになります。

"prabhat,kumar"|19|2000|"bangalore,India"|"ABC,DEF"|"GHI"|123|"KLM"|"NOP,QRS"
"prabhat,kumar"|19|2000|"bangalore,India"|"ABC,DEF"|"GHI"|123|"KLM"|"NOP,QRS"

私が試しているコード:

awk -F"," '{for(i=1;i<=NF;i++){if(i%NF==0){ORS="\n"} {if($i ~ /^\"/ || $i ~ /\"$/) {a=a OFS $i;j++;{if(j%2==0){sub(/^\,/,X,a); print a;j=0;a=""}}} else {print $i}}} {ORS="|"}}' ORS="|" OFS=, p.txt

ベストアンサー1

まず、適切なCSVパーサーを使用する必要があります。たとえば、Perlでは次のものを使用できますText::CSV

  1. インストールcpanm(Perlを使用している場合は後で感謝します)

    $ sudo apt-get install cpanminus
    

    Debian ベースのシステムを使用していない場合は、ディストリビューションのパッケージマネージャを使用してインストールできます。

  2. Text::CSVモジュールの取り付け

    $ sudo cpanm Text::CSV
    
  3. ファイルの解析

    $ perl -MText::CSV -le '
        $csv = Text::CSV->new({binary=>1}); 
        while ($row = $csv->getline(STDIN)){
        print "1:$row->[0], 2:$row->[1], 3:$row->[2], 4:$row->[3]"}' < file.csv 
    1:prabhat,kumar, 2:19, 3:2000, 4:bangalore,India
    

    上からわかるように、最初のフィールドは$row->[0]、2番目のフィールド$row->[1]などです。


これが正しい方法です。より簡単ですが汚れた方法は、引用符で囲まれたコンマを別の文字に置き換えることです。その後、通常どおり使用awkし、最後にコンマに戻ります。ここではこれを使用していますが、###フィールドの1つには決して現れないと確信しているすべてを使用できます。

$ sed -r 's/("[^",]+),([^",]+")/\1###\2/g' file.csv | 
    awk -F, '{print $1,$3}' | sed 's/###/,/g'
"prabhat,kumar" 2000

おすすめ記事