2

CSV ファイルを解析して、他のすべての郵便番号を読み取ろうとしています。各キーが郵便番号で、値がファイルに表示される番号であるハッシュを作成しようとしています。次に、内容を郵便番号-番号として印刷したいと思います。これが私がこれまでに持っているPerlスクリプトです。

use strict;
use warnings;

my %hash = qw (
     zipcode count
);

my $file = $ARGV[0] or die "Need CSV file on command line \n";

open(my $data, '<', $file) or die "Could not open '$file $!\n";
while (my $line = <$data>) {
   chomp $line;
   my @fields = split "," , $line;
   if (exists($hash{$fields[2]})) {
        $hash{$fields[1]}++;
   }else {
        $hash{$fields[1]} = 1;
   }
}

my $key;
my $value;
while (($key, $value) = each(%hash)) {
  print "$key - $value\n";
}

exit;
4

2 に答える 2

5

郵便番号がどの列にあるかはわかりませんが、3 番目のフィールドを使用して既存のハッシュ要素をチェックし、2 番目のフィールドを使用してそれをインクリメントしています。

ハッシュ要素が既に存在するかどうかをチェックする必要はありません: Perl は喜んで存在しないハッシュ要素を作成し、最初にアクセスしたときにそれを 1 に増やします。

<>また、コマンド ライン パラメータとして渡されたファイルを明示的に開く必要もありません。ファイル ハンドルなしでオペレータを使用すると、Perl はそれらを開いて読み取ります。

あなた自身のプログラムのこの作り直しはうまくいくかもしれません。郵便番号が CSV の 2 列目にあると想定しています。他の場所にある場合は、++$hash{$fields[1]}適切に変更してください。

use strict;
use warnings;

@ARGV or die "Need CSV file on command line \n";

my %counts;

while (my $line = <>) {
   chomp $line;
   my @fields = split /,/, $line;
   ++$counts{$fields[1]};
}

while (my ($key, $value) = each %counts) {
  print "$key - $value\n";
}
于 2013-05-18T20:12:09.373 に答える
2

これがトピックから外れていたら申し訳ありませんが、標準の Unix テキスト処理ツールを使用しているシステムを使用している場合は、このコマンドを使用してフィールド #2 の各値の出現回数をカウントでき、コードを記述する必要はありません。 .

cut -d, -f2 filename.csv | sort | uniq -c

これにより、次のような出力が生成されます。カウントが最初にリストされ、郵便番号が 2 番目にリストされます。

12 12345
2 56789
34 78912
1 90210
于 2013-05-18T20:28:35.583 に答える