2016-10-28 5 views
1

perl scritpsを作成してさまざまなbillersのWebサイトからCSVを自動的にダウンロードしますが、何らかの理由で$ mech-> content()からデータを1行ずつ解析するのに問題があります。コンテンツは、Perlの行ごとの解析Mechanizeのコンテンツ

#!/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="[email protected]"\n---\[email protected]\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... 
} 

マルチラインCSVファイルでもともと私は、@linesに直接)$ mech->コンテンツを(割り当てられたとして、$ mech->コンテンツ(1> =生)のようないくつか他のものを試してみましたあなたは上記の\ nまたは\ rで分割しようとしています。 ブラウザはcsvファイルをtext/plain、Quirksモード、UTF-8として表示します。 実行中のファイルtmp.csvはASCIIテキストで、複数行であることを示します。

私は間違って何をしていますか、これを行う正しい方法は何ですか?

答えて

1

問題はここにある:

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

あなたは後方改行正規表現を持っています。それは\r?\nだが、一部のシステムでは\r\nが異なる可能性があるので、リテラル文字には\015?\012と書く方が安全です。

あなたのループのためのより良いように記述することができる。

for my $line (@lines) { 

ただし、一般的に配列としてファイル全体を処理する必要はありません。あなたがやっていることは、膨大な量のメモリを使うことができます。その代わりに、最初にディスクに保存し、CSVファイルを1行ずつ読み込むほうがよいでしょう。

use autodie; 

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

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

ただし、独自のCSV解析は行わないでください。 Text::CSV_XSを使用する方がはるかに高速でバギーが少なくなります。

+0

ありがとう、今私は愚かな気分です。これらは大規模にならず、Net :: Google :: Spreadsheets :: Spreadsheetを使って大きなファイルを作成すべきです。 Raspberry Pi SDへの不要な書き込みを避けたい。解析は重複を取り消して削除しています。再度、感謝します! – Goof

関連する問題