Perl-通过两个因素查找文件中的最高值
我有一个文件,我需要把它读入Perl,用我的名字和出生年份找到所有的出生总数,然后用我的名字和年份找到出生人数最高和最低的州。我可以做第一部分,但我完全迷失了,当我试图找到最高和最低的国家,由年和月。我该如何匹配和跟踪这些信息? 以下是我目前掌握的代码:Perl-通过两个因素查找文件中的最高值,perl,Perl,我有一个文件,我需要把它读入Perl,用我的名字和出生年份找到所有的出生总数,然后用我的名字和年份找到出生人数最高和最低的州。我可以做第一部分,但我完全迷失了,当我试图找到最高和最低的国家,由年和月。我该如何匹配和跟踪这些信息? 以下是我目前掌握的代码: use 5.13.0; use warnings; use strict; my $file; my $line; my $count = 0; my $total; my $name; my $year, my $gender; my $s
use 5.13.0;
use warnings;
use strict;
my $file;
my $line;
my $count = 0;
my $total;
my $name;
my $year, my $gender;
my $state;
$file = "StateNames.csv";
open( FILE, "$file" );
while ( $line = <FILE> ) {
if ( $line =~ /Paul,1982/ ) {
( $line, $name, $year, $gender, $state, $total ) = split /,/, $line;
$count = $count + $total;
}
}
if ( $count == 0 ) {
print
"There were no people named Paul found. Please try again.";
}
print "The total number of people named Paul born in 1982 is $count";
print $state $total;
您希望将数据放入多个哈希中。这将是一个开始:
my %parsedInfo;
my @info;
my $i = 1;
while (defined (my $line = <DATA>)) {
my ($lineNumber, $name, $year, $gender, $state, $total)
= @info = split /\s+/, $line;
push @{$parsedInfo{$name}{$year}{$state}}, [@info];
}
foreach my $name (sort keys %parsedInfo) {
my $yearRef = $parsedInfo{$name};
foreach my $year (sort {$a <=> $b} keys %$yearRef) {
my $stateRef = $yearRef->{$year};
foreach my $state (sort keys %$stateRef) {
print "$name=>$year=>$state ==========\n";
for my $infoRef (@{$parsedInfo{$name}{$year}{$state}}) {
print join(':', @$infoRef), "\n";
}
}
}
}
这将创建一个对名称进行键控的哈希,该名称包含一个对年份进行键控的哈希,该年份包含一个对包含该条目数据的州进行键控的哈希
一旦你把它放入适当的散列中,你就可以做任何你想做的事情。将其放入调试器中,并逐步执行,以便更好地理解。没有更好的数据,我做不了更多
希望这有助于。。。
Steve S.数据保存在CSV文件中,格式如下所示。我需要按姓名和年份找到该州最高的出生人数406738皮拉尔1964 F CA 8 406739派珀1964 F CA 8 406740 Raelynn 1964 F CA 8 406741 Rafaela 1964 F CA 8 406742 Reba 1964 F CA 8 406743 Risa 1964 F CA 8 406744 Robbi 1964 F CA 8 406745 Rolanda 1964 F CA 8:数据库将是一个不错的选择。散列是另一个选项。
/…/
位是一个,具有特定的使用规则。您想要/Paul\s+1982/
,或者更确切地说是使用变量/$n\s+\$y/
(尽管选择更好的名称)。这将匹配具有Paul
后跟至少一个“空格”(包含选项卡)和1982
的行。也许您需要定义一些变量来保存最低和最高的数字和状态,并在循环中使用它们。
my %parsedInfo;
my @info;
my $i = 1;
while (defined (my $line = <DATA>)) {
my ($lineNumber, $name, $year, $gender, $state, $total)
= @info = split /\s+/, $line;
push @{$parsedInfo{$name}{$year}{$state}}, [@info];
}
foreach my $name (sort keys %parsedInfo) {
my $yearRef = $parsedInfo{$name};
foreach my $year (sort {$a <=> $b} keys %$yearRef) {
my $stateRef = $yearRef->{$year};
foreach my $state (sort keys %$stateRef) {
print "$name=>$year=>$state ==========\n";
for my $infoRef (@{$parsedInfo{$name}{$year}{$state}}) {
print join(':', @$infoRef), "\n";
}
}
}
}
Pilar=>1964=>CA ==========
406738:Pilar:1964:F:CA:8
Piper=>1964=>CA ==========
406739:Piper:1964:F:CA:8
Raelynn=>1964=>CA ==========
406740:Raelynn:1964:F:CA:8
Rafaela=>1964=>CA ==========
406741:Rafaela:1964:F:CA:8
Reba=>1964=>CA ==========
406742:Reba:1964:F:CA:8
Risa=>1964=>CA ==========
406743:Risa:1964:F:CA:8
Robbi=>1964=>CA ==========
406744:Robbi:1964:F:CA:8
Rolanda=>1964=>CA ==========
406745:Rolanda:1964:F:CA:8