我试图将.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::Simple的get功能.这不会返回响应正文的行列表,而是返回包含响应正文的字符串.所以一开始你可能意味着:
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)