结果文件只使用Perl打印一行

时间:2011-07-11 13:06:51

标签: perl csv while-loop

我有以下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 个答案:

答案 0 :(得分:1)

写入的代码只打印一行,因为您只调用$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 "$!";

答案 1 :(得分:0)

使用eol =&gt; “\ n”喜欢......

my $csv = Text::CSV->new ( { binary => 1, eol => "\n" } )
    or die "Cannot use CSV: ".Text::CSV->error_diag ();

答案 2 :(得分:-1)

只需查看Text::CSV的文档 您应该打开文件进行阅读,并且有 getline 方法。