首页 > 解决方案 > 根据 perl 中的标题对 CSV 列值进行排序

问题描述

我有包含 350 个字段的大型 csv 文件。标题和值应根据另一个 csv 文件中的标题进行排列。

为了尝试较小的情况,我有以下代码参考标头 {ABCD}

use File::Basename;
use Array::Utils qw(:all); 
use Text::CSV;
my @headers = qw(A B C D);
my $csv_in = Text::CSV->new({binary => 1, auto_diag => 1});
my $csv_out = Text::CSV->new({binary => 1, auto_diag => 1});
open my $in, '<:encoding(UTF-8)', 'test.csv';
open my $out, '>:encoding(UTF-8)', 'test_out.csv';

$csv_in->header($in);  
$csv_out->say($out, [@headers]);
while (my $row = $csv_in->getline_hr($in)) {
  $csv_out->say($out, [@{$row}{@headers}]);
}

它正在正确打印标题,但其他下一行的值为空

输入文件 -

A,B,D,C

1,2,4,3

预期产出 -

A B C D

1,2,3,4

电流输出 -

A B C D

,,,

谁能帮我解决这个问题?

标签: perl

解决方案


我想,我有另一个版本的 perl 和 Text::CSV。这对我有用:

$csv_in->column_names($csv_in->getline($in));

代替

$csv_in->header($in);

我的版本缺少这个功能header。但我认为,关键是您必须为输入的 CSV 文件定义列名。


推荐阅读