【问题标题】:Parsing a CSV file and Hashing解析 CSV 文件和散列
【发布时间】:2013-05-13 18:18:30
【问题描述】:

我正在尝试解析 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;

【问题讨论】:

  • 你有什么问题?
  • fields[1] 变量似乎存在一些错误。当我运行它时,它说它未初始化。
  • 您的样本输入数据是什么样的;匹配的期望输出是什么?数据包含引用字段是否存在危险?如果是这样,引用字段中的逗号怎么样?如果输入数据中有任何怪癖,您可能需要使用Text::CSV。
  • 欢迎来到 Stack Overflow。请尽快阅读FAQ。 (我第一次错过了。)你测试exists($hash{$fields[2]}),然后处理$hash{$fields[1]}++……这就是麻烦吗?
  • 一行看起来像:511 Marshall Square 44965 Rosemount Connecticut 689-068-3997

标签: perl parsing csv hash


【解决方案1】:

你没有说你的邮政编码在哪一列,但是你使用第三个字段来检查现有的哈希元素,然后用第二个字段来增加它。

无需检查散列元素是否已经存在:Perl 会很高兴地创建一个不存在的散列元素,并在您第一次访问它时将其递增为 1。

也不需要显式打开作为命令行参数传递的任何文件:如果您使用 &lt;&gt; 运算符而不使用文件句柄,Perl 将打开并读取它们。

您自己的程序的这种修改可能会奏效。它假定邮政编码位于 CSV 的第二列中。如果它在其他任何地方,只需适当地更改++$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";
}

【讨论】:

  • 哦,Perl 太甜了 :) 如果你忘记喝咖啡,Perl 会带给你 :)
【解决方案2】:

很抱歉,如果这是题外话,但如果您在使用标准 Unix 文本处理工具的系统上,您可以使用此命令计算字段 #2 中每个值的出现次数,而无需写任何代码。

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

这将生成类似这样的输出,其中首先列出计数,然后是邮政编码:

12 12345
2 56789
34 78912
1 90210

【讨论】:

    猜你喜欢
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    相关资源
    最近更新 更多