CSVを名寄せして一行にまとめるperlスクリプト / perl script to aggregate csv records

名前をキーに、複数行のCSVデータを一行にまとめます。

入力ファイル

$ cat input.csv
上根来水源の森,水源の森百選
上山公園,全国森林浴の森百選
上山公園,日本の都市公園100選
上山公園,日本の歴史公園100選
城崎温泉,日本百名湯
城山公園,全国森林浴の森百選
城山公園,日本のさくら名所100選
城山公園,日本の都市公園100選
城山公園,日本の夕陽百選
城山公園,日本の歴史公園100選
城山公園,夜景100選
城山展望台,夜景100選

1フィールド目をキーにCSVを名寄せするperlスクリプト

$ cat aggregatecsv.pl
#!/usr/bin/perl

use strict;
use warnings;
use URI;
use Text::CSV;
use Text::CSV::Encoded;
binmode STDOUT, ":utf8";

my $csv = Text::CSV::Encoded->new ({
  encoding_in  => "utf8",
  encoding_out => "utf8",
});
my $infile = URI->new($ARGV[0]);

open my $fh, '<', $infile or die $!;

my %data;
while (my $line = <$fh>) {
  $csv->parse($line) or die "Invalid data line";
  my ($key, $val) = $csv->fields;
  push @{ $data{$key} }, $val
}

for my $id (sort keys %data) {
  printf "%s,%s\n", $id, join ':', @{ $data{$id} };
}

結果

$ perl aggregatecsv.pl input.csv
上山公園,全国森林浴の森百選:日本の都市公園100選:日本の歴史公園100選
上根来水源の森,水源の森百選
城山公園,全国森林浴の森百選:日本のさくら名所100選:日本の都市公園100選:日本の夕陽百選:日本の歴史公園100選:夜景100選
城山展望台,夜景100選
城崎温泉,日本百名湯