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

如何使用Text::CSV模块在Perl中过滤CSV文件的列?,perl,csv,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文件,比如说有三列: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);
预期的输出.tsv

firstname    lastname
John         Doe
输出.tsv实际值

firstname    lastname 
1     John
我不这么认为

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

如果您将此行更改为

$csv->column_names(qw(id firstname lastname));
*-您还需要删除输入中
“id”
“firstname”
之间的多余空格,或者在构造函数中为
$csv
使用设置
allow\u loose\u quotes=>1

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

如果您将此行更改为

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

*-您还需要删除输入中
“id”、
“firstname”
之间的零散空格,或者在
$csv

的构造函数中使用设置
allow\u loose\u quotes=>1
,我已向代码添加了两个缺失的部分(第一个new()调用)。我已向代码添加了两个缺失的部分(第一个new()调用)啊,太简单了!我已经太累了,看不到。。。输入文件没问题,我把多余的空间写错了。非常感谢。啊,太容易了!我已经太累了,看不到。。。输入文件没问题,我把多余的空间写错了。非常感谢。