一部のフィールドのフィールド値にカンマを含むCSVファイルからデータを抽出します。

一部のフィールドのフィールド値にカンマを含むCSVファイルからデータを抽出します。

CSVファイルを解析する方法

ファイル名:abc.csv(csvファイル)上記のファイルには、次のデータが含まれています。

abv,sfs,,hju,',',jkk
wff,fst,,rgr,',',rgr
ere,edf,erg,',',rgr,rgr

他のフィールドを抽出して別の変数に割り当てる必要があるのと同じ要件があります。

私のコード:

 cat $file | awk 'NR!=1' | while read -r line
  do
     a=`echo "$line" | awk -F',' '{print $1}'`
     b=`echo "$line" | awk -F',' '{print $2}'`
     c=`echo "$line" | awk -F',' '{print $3}'`
     d=`echo "$line" | awk -F',' '{print $4}'`
     e=`echo "$line" | awk -F',' '{print $5}'`
     f=`echo "$line" | awk -F',' '{print $6}'`
     echo "$e"
     echo "$f"
done

出力:(一重引用符で出力を提供します)

'
'
'
'
'
'

必要な出力は次のようになります。 (私の5番目のフィールドの値は「comma」です。)

   ,
   jkk
   ,
   rgr
   ,
   rgr
   rgr

ベストアンサー1

cvscut以下で使用csvkitツールボックス:

$ csvcut -q "'" -c 5,6 file.csv
",",jkk
",",rgr
rgr,rgr

データに非標準の引用符(一重引用符)が使用されたことを知らせる必要があり-q "'"ます。 5番目と6番目の列をcsvcut抽出します。-c 5,6出力は正しい形式のCSV文書です。

引用符を追加せずに5番目の列のみを取得するには、次の手順を実行します。

$ csvcut -q "'" -c 5 file.csv | csvformat -T
,
,
rgr

csvcutこれはスルーの出力を渡し、csvformat出力区切り文字としてコンマの代わりにタブを使用する必要があります。データにタブ文字がないため、データを引用する必要はありません。

これは、タブ区切り形式で複数の列を取得するのにも有効です。

$ csvcut -q "'" -c 5,6 file.csv | csvformat -T
,       jkk
,       rgr
rgr     rgr

また、コンマで区切られたすべてのデータをタブ区切りのデータに変換するのにも役立ちます。

$ csvformat -q "'" -T file.csv
abv     sfs             hju     ,       jkk
wff     fst             rgr     ,       rgr
ere     edf     erg     ,       rgr     rgr

タブ区切りデータを使用すると、標準のUnixツールを使用してデータをより簡単に処理できます。

$ csvformat -q "'" -T file.csv | cut -f 5,6
,        jkk
,       rgr
rgr     rgr

以下は、予想される出力を再現します。

$ csvformat -q "'" -T file.csv | awk -F '\t' '{ print $5; print $6 }'
,
jkk
,
rgr
rgr
rgr

(質問の予想出力に予期しないカンマがあります。対応する列からのものとします。4つ最後の行に。あってはいけません。 )


高度な解析には、PythonやPerlなどの他のスクリプト言語を検討してください。

PerlのモジュールはText::CVSCSVデータへの簡単なアクセスを提供します。以下は、Perlでファイル全体を配列配列として読み取ることが非常に簡単であることを示しています。

$ perl -MData::Dumper -MText::CSV=csv -e '$c = csv(in=>"file.csv",quote_char=>"\x27");print Dumper($c)'
$VAR1 = [
          [
            'abv',
            'sfs',
            '',
            'hju',
            ',',
            'jkk'
          ],
          [
            'wff',
            'fst',
            '',
            'rgr',
            ',',
            'rgr'
          ],
          [
            'ere',
            'edf',
            'erg',
            ',',
            'rgr',
            'rgr'
          ]
        ];

おすすめ記事