逐行解析 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.
速度更快,故障更少
正在创建 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.
速度更快,故障更少