都道府県名でのエクセル並べ替えサンプルコード
この sort のカスタマイズの仕組みを利用して都道府県順に並べ替えを行うのですが、いちいちハッシュをプログラムコード内に定義するのは面倒ですね。運用上、順番を分かりやすく指定する事も重要ですので、並べ替えの順番の指定は外部のテキストファイルに指定して、自動的にハッシュを構成する事にします。プログラム全体以下のようになりました。sort の指定はさらに複雑になっていて、$a、$b には配列の要素であるハッシュ (の参照) が代入されます。ここから都道府県名を取り出して、さらにその値で %index を調べます。
並べ替え対象CSVファイルのサンプル
1,株式会社山田商事,1230094,東京都,杉並区,高円寺東3-3-3 2,株式会社鈴木貿易,9870021,大阪府,大阪市南区,島中9-9-9 3,三晃珈琲有限会社,0032912,北海道,札幌市,北東12条3 4,株式会社鈴木貿易,9870021,大阪府,大阪市南区,島中9-9-9
プログラムコード
#!/usr/bin/perl --
# CSVの一覧を都道府県順に並べ替える
# usage: perl sort_by_pref.pl INPUT_CSV > OUTPUT_CSV
use strict;
use warnings;
use utf8;
my (%conf, %index);
# 環境設定
# 並べ替え対象ファイル
$conf{input_csv} = shift @ARGV; #実行時にコマンドラインから指定したファイル名が @ARGV に格納されている
$conf{csv_enc} = 'cp932'; #文字コード
# 都道府県設定ファイル (都道府県名を並べ替え順に列挙したもの)
$conf{pref_list} = 'prefs.txt';
$conf{pref_enc} = 'cp932'; #文字コード
# 処理
# 都道府県設定を読み込み、ハッシュに格納
my $fh;
open ($fh, "<:encoding($conf{pref_enc})", $conf{pref_list})
or die "Can't open $conf{pref_list}: $!\n"
;
my $i=0;
while (<$fh>){
$_ =~ s/\s+//g; #空白は除く。
$index{$_} = ++$i; # ++ で1を加算してから順位として代入する。
}
close ($fh);
# CSV を読み込み。左から4番目の列が都道府県
open ($fh, "<:encoding($conf{csv_enc})", $conf{input_csv})
or die "Can't open $conf{input_csv}: $!\nusage: perl sort_by_pref.pl INPUT_CSV > OUTPUT_CSV\n"
;
# まずは情報を配列に入れてしまう。 (つまり、あまり大きいファイルには使えない)
my @lines; # 各要素の構成:{line => 行全体、pref => 都道府県}
while (<$fh>){
push(@lines, {line=>$_, pref=>(split(/,\s*/, $_))[3]}); # カンマで区切った4番目の要素を取り出す
}
close ($fh);
# 並べ替えと出力
# 書き出し文字コードを準備
binmode STDOUT, "encoding($conf{csv_enc})";
# $a, $b にはそれぞれ配列に格納したハッシュが入るので、そこに格納されている
# 都道府県情報を元に %index を調べる
for (sort {
$index{$a->{pref}} <=> $index{$b->{pref}}
} @lines){
print $_->{line};
}
close ($fh);
実行コマンド例
perl sort_by_pref.pl sample.csv > result.csv







