解析CSV文件中的额外行

时间:2013-11-25 21:16:02

标签: perl parsing csv

我有一个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解析它。

  1. 有没有办法摆脱第一线? (我想我可以跳过它)
  2. 以第二行作为列名(跳过第一行“!”)
  3. 读到[文件结束],这是一个字符串,而不是EOF符号?

2 个答案:

答案 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行。

希望这有帮助!