拆分由文件perl的管道分隔的数据

时间:2018-03-09 16:39:47

标签: perl

我有一个文件,我有数据管道分隔有一些值0,1或一些文本。现在我要做的是逐行读取文件并拆分由管道分离的数据,然后如果任何索引的值为1,那么我创建增量它的值为1到哈希值,所以最后我有一个哈希值将详细说明文件中有多少真值。

下面是数据示例和每个值的名称,如果值为1,则哈希键值将增加1

A B C D E F G    H       I
===========================
0|0|0|1|0|0|ABC|15:44:07|0
0|0|0|1|0|0|ABC|15:44:07|0
0|0|0|0|0|0|ABC|15:44:07|0
0|1|0|0|0|1|ABC|15:44:07|0

所以最终出局将如下:

$finalHash->{D} = 2;
$finalHash->{F} = 1;
$finalHash->{B} = 1;

我能够逐行读取文件:

 my $final_hash;
 for my $line ( <$ifh> ) {

    my @el = split( /\|/, $line );

    #Now here have to set the value in the hashkey where we will get the 1 value


  }

1 个答案:

答案 0 :(得分:5)

不要使用for来迭代文件行,请使用while。如果文件非常大,前者可能耗尽内存,因为它需要创建所有行的列表;后者一次读一行。

#! /usr/bin/perl
use warnings;
use strict;

my @column_names = qw( A B C D E F );

my %counts;

while (<DATA>) {
    my @columns = split /\|/;
    for my $i (0 .. $#column_names) {
        ++$counts{ $column_names[$i] } if $columns[$i];
    }
}

use Data::Dumper; print Dumper \%counts;

__DATA__
0|0|0|1|0|0|ABC|15:44:07|0
0|0|0|1|0|0|ABC|15:44:07|0
0|0|0|0|0|0|ABC|15:44:07|0
0|1|0|0|0|1|ABC|15:44:07|0