逐行解析 Perl Mechanize 内容

Line by line parsing of Perl Mechanize content

正在创建 perl scritps 以从各种计费网站自动下载 CSV,但由于某种原因,我无法将 $mech->content() 中的数据转换为我可以逐行解析的内容。内容是多行 CSV 文件,

#!/usr/bin/perl
use WWW::Mechanize;
use IO::Socket::SSL qw();

my $mech = WWW::Mechanize->new();
...stuff...
my $data=$mech->content();
my (@lines)=split(/\n?\r/,$data);
print "lines=".@lines."\n---\n@lines\n---\n";
write_file("tmp.csv",$data);

for(my $i=0;$i<@lines;$i++){
    ...work that's done that depends on each 
    line being represented as an element of 
    an array... 
}

最初我将 $mech->content() 直接分配给@lines,尝试了一些其他的东西,比如 $mech->content( raw => 1 ),正如你在上面看到的,我尝试用 \n 或\r。 浏览器将 csv 文件显示为 text/plain、Quirks 模式、UTF-8 运行 文件 tmp.csv 显示它是 ASCII 文本并且是多行的。

我做错了什么,正确的做法是什么?

问题出在这里:

my (@lines)=split(/\n?\r/,$data);

你的换行正则表达式倒转了。它是 \r?\n,但为文字字符编写 5?2 更安全,因为 \r\n 在某些系统上可能不同。

你的 for 循环可以更好地写成:

for my $line (@lines) {

但是,您通常不希望将整个文件作为数组处理。您正在做的事情会占用大量内存。相反,最好先将其保存到磁盘并逐行读取 CSV 文件。

use autodie;

$mech->get( $uri, ':content_file' => "test.csv" );

open my $fh, "test.csv";
while( my $line = <$fh> ) {
    ...
}

但不要自己进行 CSV 解析。使用 Text::CSV_XS.

速度更快,故障更少