如何使用Perl正确计算CSV文档中的字段长度?

时间:2010-01-25 11:14:36

标签: perl

我有一个数据,并喜欢使用Perl脚本执行简单的while操作。 以下是数据集中的一个小提取:

  

“号码”, “代码”, “国家”, “伽马”, “X1”, “X2”, “X 3”, “X4”, “X5”, “X6”   1, “DZA”, “阿尔及利亚”, “0.01”,7.44,47.3,0.46,0,0,0.13   2, “前”, “安哥拉”, “0.00”,6.79 “NULL”,0.21,1,0,0.28   3, “奔”, “贝宁”, “ - 0.01”,7.02,38.9,0.27,1,0,0.05   4, “BWA”, “波扎那”, “0.06”,6.28,45.7,0.42,1,0,0.07   5,“HVO”,“Burkina Faso”,“0.00”,6.15,36.3,0.08,1,0,0.05   6, “BDI”, “蒲隆地”, “0.00”,6.38,41.8,0.18,1,0,0

脚本应计算每个,分隔字段的长度并存储最高值 成阵列。

但是,保存无法正常工作。以下是代码的一部分:

@maxl = map length, @terms;

while(`<INFILE>`) {
$_ =~ s/[\"\n]//g ;
@terms = split/$sep/, $_;
@lengths = map length, @terms;
for($k = 0, $k <= $#terms, $k++) { 
    if($lengths[$k] > $maxl[$k]) {
    $maxl[$k] = $lenghts[$k];
    }
}
print "@lengths\n";
}

现在@maxl使用代码中的早期部分,它使用数据集的第二行。 当我使用print命令只是为了查看我得到的@maxl操作的值:

  

1 3 7 4 4 4 4 1 1 5

while循环中我使用另一个print语句只是为了查看其他值,我得到:

1 3 6 4 4 4 4 1 1 4
1 3 5 5 4 4 4 1 1 4
1 3 8 4 4 4 4 1 1 4
1 3 12 4 4 4 4 1 1 4
1 3 7 4 4 4 4 1 1 1
1 3 8 4 4 4 4 1 1 4
1 3 10 4 4 4 4 1 1 4
1 3 16 5 4 4 4 1 1 4
2 3 4 5 3 4 4 1 1 4
2 3 7 4 4 4 4 1 1 4
2 3 5 4 4 4 4 1 1 4
2 3 5 4 4 4 4 1 1 4
2 3 8 4 4 4 4 1 1 4
2 3 5 4 4 4 1 1 1 4

第四列显然具有大于3的值。while循环应该保存最大值并将这些值替换为@maxl

出了什么问题?


...在for循环中,逗号错误

for($k = 0, $k <= $#terms, $k++)
然而,在清理之后,似乎仍然存在问题...

1 个答案:

答案 0 :(得分:9)

这里有一个错字 $maxl[$k] = $lenghts[$k]; 对于初学者('使用严格'会抓住)

考虑使用Text::CSV更可靠地解析逗号分隔数据(它还可以处理其他分隔符):

#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;

my $csv = Text::CSV->new();
my @max_lengths;

while ( my $line = <INFILE> ) {

    die "Unable to parse '$line'" unless $csv->parse($line);

    my @column_lengths = map { length } $csv->fields();

    for my $i ( 0 .. $#column_lengths ) {
        if ( $column_lengths[$i] > ($max_lengths[$i] || 0) ) {
            $max_lengths[$i] = $column_lengths[$i];
        }
    }
}

print "MAX LENGTHS OF EACH FIELD: @max_lengths\n";