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

从perl文件中拆分由管道分隔的数据,perl,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|AB

我有一个文件,我有数据管道,它有一些值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


  }
my$final\u散列;
对于我的$行(){
my@el=拆分(/\ \ \/,$line);
#现在我们必须在hashkey中设置值,在这里我们将得到1值
}

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

#! /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
#/usr/bin/perl
使用警告;
严格使用;
my@column_names=qw(A B C D E F);
我的百分比计算;
而(){
我的@columns=split/\\|/;
对于我的$i(0..$#列名称){
++$counts{$column_names[$i]}如果$columns[$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 | 1 | ABC | 15:44:07 | 0

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

#! /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
#/usr/bin/perl
使用警告;
严格使用;
my@column_names=qw(A B C D E F);
我的百分比计算;
而(){
我的@columns=split/\\|/;
对于我的$i(0..$#列名称){
++$counts{$column_names[$i]}如果$columns[$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 | 1 | ABC | 15:44:07 | 0

您有什么问题?看来你走对了方向@MikeTung我无法理解如何从文件数据创建散列并增加值。我是新来的你有什么问题?看来你走对了方向@MikeTung我无法理解如何从文件数据创建散列并增加值。我是perlMight方面的新手,值得补充一下,为什么在这种情况下使用
for
是不好的,因为如果您还不知道会有什么不同,现在还不清楚know@choroba:为什么您喜欢在
$counts{$column\u names[$i]}++
中使用后固定增量?“这是很难读懂的。”博罗丁:因为一个老习惯。预增量可能也更快。@choroba:如果不使用表达式的值,我希望差异得到优化,但是太多的人使用
$c++
,而他们真正的意思是
++$c
,仅仅因为语言的名称。Pre increment更容易理解,特别是当操作数是一个长表达式时,因为它将“动词”放在第一位。@choroba@Borodin顺便说一句:
perl-MO=Deparse-e'$counts{$column_names[$i]}++if$columns[$i];'如果$columns[$i],则输出<代码>+$counts{$column_names[$i]}
(操作树显示Perl确实将其更改为preinc)可能值得补充一下,为什么在这种情况下使用
for
是不好的,因为如果您还没有这样做的话,差异会是什么还不明显know@choroba:为什么您喜欢在
$counts{$column\u names[$i]}++
中使用后固定增量?“这是很难读懂的。”博罗丁:因为一个老习惯。预增量可能也更快。@choroba:如果不使用表达式的值,我希望差异得到优化,但是太多的人使用
$c++
,而他们真正的意思是
++$c
,仅仅因为语言的名称。Pre increment更容易理解,特别是当操作数是一个长表达式时,因为它将“动词”放在第一位。@choroba@Borodin顺便说一句:
perl-MO=Deparse-e'$counts{$column_names[$i]}++if$columns[$i];'如果$columns[$i],则输出<代码>+$counts{$column_names[$i]}(操作树显示Perl确实将其更改为preinc)