我有一个文件,我有数据管道分隔有一些值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
}
答案 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