我有一个csv文件,在标题中有一些额外的行,最后一行在最后一行,如下所示:
!ReleaseDate:20131120
!id|AssetIDType|AssetID|StartDate|EndDate
ARGAAA1|CINS|P00879117|19860131|20090323
ARGAAA1|CUSIP|P00879117|19860131|20090323
......
ZIMADQ1|SEDOL|B7W9VC2|20121008|20751231
[End of File]
我想使用Text :: CSV_XS解析它。
答案 0 :(得分:2)
有没有办法摆脱第一线? (我想我可以跳过它)
您可能会检查以!
开头的行,或者如果您对文件格式非常有信心,可以跳过第一行。
以第二行作为列名(跳过第一行!)
您可以使用getline
读取标题行,然后将生成的arrayref传递给column_names
,然后使用getline_hr
读取文件的其余部分。该模块的文档提供了这样的示例:
my @cols = @{$csv->getline($io)};
$csv->column_names(@cols);
while (my $row = $csv->getline_hr($io)) {
print $row->{price}; #this assumes there is a 'price' field
}
如果您要阅读 lot 数据,可以使用模块文档中的示例再次使用bind_columns
进行优化。
阅读直到我收到[文件结束]?
如上面的代码片段所示,while
循环可以解决这个问题。一旦你到达文件的末尾,各种getline函数将返回undef或其他一些false值。这将终止循环。
答案 1 :(得分:2)
您可以执行以下操作:
use strict;
use warnings;
use Text::CSV_XS;
my $csv = Text::CSV_XS->new( { binary => 1, auto_diag => 1, sep_char => '|' } );
open my $fh, "<:encoding(utf8)", 'File.csv' or die "File.csv: $!";
while ( my $row = $csv->getline($fh) ) {
next if $row->[0] =~ /^!|\[/;
print $row->[2], "\n";
}
close $fh;
数据集输出:
P00879117
P00879117
B7W9VC2
如果当前的一行以第一列中找不到的字符(或一组字符)开头,则会获得next
行。
希望这有帮助!