如何使用Text :: CSV模块在Perl中过滤CSV文件的列?

时间:2016-10-19 16:30:50

标签: perl csv

我有一个CSV文件,可以说有三列:id,firstname,lastname。 我使用Text :: CSV将此文件转换为TSV文件,但我还需要删除id列。

我最终得到了这段代码,但错误地导出了所需的列:最终文件包含firstname,lastname标题,但值来自id和firstname。

my $fhin;
open($fhin, "<", "input.csv");
my $fhout;
open($fhout, ">", "output.tsv");
my $csv = Text::CSV->new({binary => 1});
my $tsv = Text::CSV->new({binary => 1, sep_char => "\t", eol => "\n", quote_char => undef});
$csv->column_names(qw(firstname lastname));
$tsv->column_names(qw(firstname lastname));
while (my $row = $csv->getline_hr($fhin)) {
    $tsv->print_hr($fhout, $row);
} 
close($fhin);
close($fhout);

我在这里阅读了文档:http://search.cpan.org/~makamaka/Text-CSV-1.33/lib/Text/CSV.pm

我的代码出了什么问题?

input.csv

"id","firstname","lastname"
1,John,Doe

output.tsv预期

firstname    lastname
John         Doe

output.tsv actual

firstname    lastname 
1     John

1 个答案:

答案 0 :(得分:2)

我不认为

$csv->column_names(qw(firstname lastname))

做你认为它做的事。您似乎认为它将数据合并到文件的标题行中,并生成对与名称“firstname”和“lastname”(即第2和第3列)对应的列的引用。但它在输入文件中的真正作用是将名称与输入中的列相关联,而不管标题行中的内容是什么。也就是说,它将名称“firstname”分配给第1列,将“lastname”分配给第2列。

如果将此行更改为

,您的代码将起作用 *
$csv->column_names(qw(id firstname lastname));

* - 您还要删除输入中"id","firstname"之间的杂散空间,或使用构造函数中的allow_loose_quotes => 1设置{ {1}}。