我有一个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
答案 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}}。