代码之家  ›  专栏  ›  技术社区  ›  mropa

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

  •  2
  • mropa  · 技术社区  · 16 年前

    我有一个数据集,喜欢做一个简单的 while 以下是从数据集中提取的一个小样本:

    1、“DZA”、“阿尔及利亚”、“0.01”、7.44,47.3,0.46,0,0,0.13 2,“前”、“安哥拉”、“0.00”、6.79、“空”、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”、“布基纳法索”、“0.00”、6.15,36.3,0.08,1,0,0.05 6、“布隆迪首都”、“布隆迪”、“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 命令只查看 @马克斯 我得到的行动:

    1 3 7 4 4 4 4 1 1 5

    我用了另一个 打印 语句仅为了查看其他值,我得到:

    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
    

    第四列eg的值明显大于3 循环应该保存最大值并将这些值替换为 @马克斯 .

    出了什么问题?


    for 循环逗号是错误的

    for($k = 0, $k <= $#terms, $k++)
    

    1 回复  |  直到 15 年前
        1
  •  9
  •   Sinan Ünür    16 年前

    这里有个打字错误 $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";