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

如何使用Perl解析下载的CSV数据?,perl,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->f

我试图将一个.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";
 }
我认为将CSV文件放入数组并从那里解析会更有效,而不是下载文件、保存文件然后将其slurp到文件句柄中。然而,上面的代码不起作用,我不明白为什么。我得到“警告:test.pl出现问题”;至少可以说,这不是很有帮助


这更多是为了学习。我不必这样做,但这只是困扰我为什么不能将Text::CSV与数组一起使用。

我假设您正在使用
LWP::Simple
get
函数。它不返回响应体的行列表,而是返回包含响应体的字符串。所以一开始,你的意思可能是:

my $content = get($uri);
现在,您可以逐行阅读,将每一行传递给
Text::CSV
s
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 };
    ...
}

打开我的$fh,
获取功能是什么?从
LWP::UserAgent
?您确认了
@file
的元素是来自
file.csv
的行吗?我假设
get
是来自
LWP::UserAgent
?一般来说,您应该发布
使用XXX
部分代码。一个
get
与另一个不一样……不太有用的“有问题”错误是因为您实际上没有告诉perl给您一个有用的错误<代码>$仅在系统调用失败时设置,对模块的调用通常不会设置
$。当
warn
ing或
die
ing包含描述性文本以及任何适用的错误变量时,这始终是一种良好的做法。像
。。。或警告“获取失败”
。。。或警告“解析失败”。描述得越多越好<代码>$被省略,因为get或parse可能不会设置它(但请检查它们的文档以进行验证)。在rafl的回答中,您仍然希望在调用openAlways show complete演示程序时包含它,并记住始终向我们展示一些示例输入。我们无法可靠地猜测发生了什么事。:)当您遇到此类问题时,请先查看您拥有的数据,然后再继续下一步。