如何使用Perl解析下载的CSV数据?

kri*_*ten -1 perl

我试图将.csv文件下载到一个数组中,然后使用Text :: CSV逐行解析每个列.我有以下内容:

my @file = get("http://www.someCSV.com/file.csv") or warn $!;

my $CSV = Text::CSV->new();
$CSV->sep_char (',');

for ( @file ) {

  $CSV->parse($_) or warn $!;

      my @columns = $CSV->fields();
      print $columns[0] . "\n";
 }
Run Code Online (Sandbox Code Playgroud)

我认为将CSV文件放入数组并从那里解析会更有效率,而不是下载文件,保存文件然后将其拖入文件句柄.但是,上面的代码不起作用,我不明白为什么.我得到"警告:test.pl上的错误"; 至少可以说,不是很有帮助.

这更适合学习.我不必这样做,但它只是困扰我为什么我不能使用Text :: CSV与数组.

raf*_*afl 11

我假设你在那里使用它LWP::Simpleget功能.这不会返回响应正文的行列表,而是返回包含响应正文的字符串.所以一开始你可能意味着:

my $content = get($uri);
Run Code Online (Sandbox Code Playgroud)

您现在可以逐行读取该行,将每行传递给Text::CSVs parse方法.这似乎在某些情况下有效,但由于CSV文件可能包含嵌入的换行符,因此它不会非常可靠.

相反,Text::CSV通过传递它可以自己读取的文件句柄,让我们弄清楚输入中究竟是什么行.为此,无需在本地保存文件.你可以打开字符串的句柄:

open my $fh, '<', \$content or die $!;

my $csv = Text::CSV->new({ sep_char => ',' });
while (my $row = $csv->getline($fh)) {
    my @fields = @{ $row };
    ...
}
Run Code Online (Sandbox Code Playgroud)