我正在尝试将数据写入新的CSV文件。我知道如何创建新文件以及如何从旧文件中收集我想要的数据,但我不确定如何将收集的数据实际写入新文件。我希望我打印的列也写入新的CSV文件。这就是我到目前为止所做的:
use strict;
use warnings;
use Text::CSV_XS;
my @data;
my $file = 'FinalTest.csv'; #original file
my $newfile = 'filteredData.csv'; #new file
my $csv = Text::CSV_XS->new({ binary => 1 });
open my $fh, '<', $file or die "Could not open $file: $!";
my $header = $csv->getline($fh)
or die("No header\n");
$csv->column_names(@$header); #removes header row
while( my $row = $csv->getline($fh) ) {
push @data, $row;
printf "$row->[0]\t";
printf "$row->[1]\t";
printf "$row->[2]\t";
printf "$row->[3]\t";
printf "$row->[13]\n";
}
open my $newfile, '>', $newfile or die "Could not write $newfile"; #create new file
答案 0 :(得分:-1)
你很亲密,你的事情却错了。新文件open
的行应该在while
循环之前。然后,您需要将该文件句柄添加到printf
语句中。虽然它们应该只是print
语句,因为您没有进行任何格式化。
open my $newfile, '>', $newfile or die "Could not write $newfile"; #create new file
while( my $row = $csv->getline($fh) ) {
push @data, $row;
print $newfile "$row->[0]\t";
print $newfile "$row->[1]\t";
print $newfile "$row->[2]\t";
print $newfile "$row->[3]\t";
print $newfile "$row->[13]\n";
}
此外,您还可以执行输出这样的行,因为如果您想要更改输出的列或重新排序它们,它会更容易。
print $newfile join("\t",@$row[0,1,2,3,13]),"\n";
如果您需要输出中的标题,请将其放在循环之前。
print $newfile join("\t",@$header[0,1,2,3,13]),"\n";