我有以下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”文件中。 如何将所有结果放入结果文件中。
提前致谢。
答案 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 方法。