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::CVS
CSVデータへの簡単なアクセスを提供します。以下は、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'
]
];