从perl文件中拆分由管道分隔的数据
我有一个文件,我有数据管道,它有一些值0、1或一些文本。现在,我要做的是逐行读取文件,并通过管道分割数据,然后如果任何索引的值为1,那么我将创建增量,它的值为1,并放入一个散列中,所以最后我有一个散列,它将给出文件中有多少个真值的详细信息 下面是数据示例和每个值的名称,如果值为1,则在哈希键中,值将递增1从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
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)