如何解析 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
输出:(它以单引号形式给出输出)
'
'
'
'
'
'
所需的输出应该是这样的:(我的第五个字段的值为“逗号”)
,
jkk
,
rgr
,
rgr
rgr
答案1
使用cvscut
来自csvkit
工具箱:
$ csvcut -q "'" -c 5,6 file.csv
",",jkk
",",rgr
rgr,rgr
需要-q "'"
告诉csvcut
数据中使用了非标准引用字符(单引号)。提取-c 5,6
第五列和第六列。输出将是格式正确的 CSV 文档。
要仅获取第五列,不添加引号:
$ csvcut -q "'" -c 5 file.csv | csvformat -T
,
,
rgr
csvcut
这会传递through的输出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
(请注意,问题中的预期输出有一个意外的逗号,我假设它来自列四在最后一行。它不应该在那里。)
对于更高级的解析,请考虑其他脚本语言,例如 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'
]
];
答案2
与米勒
<input sed "s/'/\"/g" | mlr --c2x --implicit-csv-header cut -f 5,6 | \
grep -v "^$" | cut -d " " -f 2
给你
,
jkk
,
rgr
rgr
rgr
它不是 awk,它是 Miller 的一个很棒的结构化文本工具(http://johnkerl.org/miller/doc/)。