Файл результатов печатает только одну строку с использованием Perl - PullRequest
0 голосов
/ 11 июля 2011

У меня есть следующий Perl,

open (FILE, 'file.htm');
my $tree = HTML::TreeBuilder->new_from_content(do { local $/; <FILE> }); 

for ( $tree->look_down( 'class' => 'postbody' ) )
{     
    my $location = $_->look_down( 'class' => 'posthilit' )->as_trimmed_text;     
    my $comment  = $_->look_down( 'class' => 'content' )->as_trimmed_text;     
    my $name     = $_->look_down( '_tag'  => 'h3' )->as_text;     

    $name =~ s/^Re:\s*//;     $name =~ s/\s*$location\s*$//;      
    print "Name: $name\nLives in: $location\nCommented: $comment\n";

    my $csv = Text::CSV->new(); 
    $csv->column_names('field1', 'field2', 'field3'); 
    $csv->print ($fh, [$name,$location,$comment]);
    open $fh, ">", "file.csv" or die "ERROR: $!";
    close $fh or die "$!";
}

Это выводит только одну строку из входного файла в новый файл 'file.csv'.Как я могу получить его, чтобы поместить все результаты в файл результатов.

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 11 июля 2011

Код, как написано, печатает только одну строку, потому что вы звоните $csv->print только один раз. Поскольку у вас, очевидно, имеется более одной строки данных, вам необходимо создать цикл, который печатает все строки. Как то так:

while (my ($name, $location, $comment) = next_record()) {
    $csv->print($fh, [$name, $location, $comment]);
}

Я не могу дать вам более подробный ответ, чем этот, не увидев остальную часть вашего кода и не зная, как назначены переменные $name, $location, $comment.


Обновление после редактирования вопроса:

У вас есть цикл с for ($tree->look_down(...)), который в порядке и занимает место цикла while, который я описал выше. Однако, как написано в настоящее время, вы создаете новый объект $csv и новый файл каждый раз в цикле! Вот почему вы получаете только одну строку в выходном файле. Вам нужно взять следующие строки и поместить их перед началом цикла for:

my $csv = Text::CSV->new(); 
$csv->column_names('field1', 'field2', 'field3');
open $fh, ">", "file.csv" or die "ERROR: $!";

Внутри цикла вам нужно всего лишь сделать это:

$csv->print ($fh, [$name,$location,$comment]);

Затем, после завершения цикла, вы можете сделать это:

close $fh or die "$!";
0 голосов
/ 05 июня 2015

Используйте eol => "\ n", как ...

my $csv = Text::CSV->new ( { binary => 1, eol => "\n" } )
    or die "Cannot use CSV: ".Text::CSV->error_diag ();
0 голосов
/ 11 июля 2011

Просто проверьте документацию Text :: CSV Вы должны открыть файл для чтения, и есть метод getline .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...