如何使用Perl解析下载的CSV数据?
我试图将一个.csv文件下载到一个数组中,然后用Text::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
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
sparse
方法。在某些情况下,这似乎是可行的,但由于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演示程序时包含它,并记住始终向我们展示一些示例输入。我们无法可靠地猜测发生了什么事。:)当您遇到此类问题时,请先查看您拥有的数据,然后再继续下一步。