通販サイトのピークスクラブで永らく使ってましたが、ふと最近文字化けするようになり対策がないかググッてますと、ajaxzip2に致命的なバクがあるとか…
調べると1500件以上郵便番号が重複していて、ajaxで書き出されるのが重複郵便番号の最初の1件のみでした…
公開されているプログラムで楽しようと使わせていただいていましたが結局ちょい手を加えて対応しました。
例えば郵便番号が028-7302の場合、
八幡平市 松川温泉
八幡平市 松尾寄木
八幡平市 八幡平温泉郷
と3件あり選択できるようにしました。
http://www.post.japanpost.jp/zipcode/dl/kogaki/lzh/ken_all.lzhから全国の圧縮版を入手し、解凍先のフォルダに下のプログラムを入れて走らせるともれなく書き出します(たぶん)
やっつけなんで突っ込みどころ満載ですが…
sjisで保存して、郵便番号はajaxzip2と同じ書式でutf-8での書き出しになってます。
重複時は県番号にWを付けたので、””でくくらないとjsonで読み出せなくなりますので…
で、後はajaxzip2.jsを適当に修正して完成です。参考になさる方は、ソース覗いてください。
https://www.peaks.jp/order/DataFile/ajaxzip2.js
※ 県配列は運送会社の料金区分で分けれるよう入れ替えてますのでjsファイルをまんま使うと大変な事になりますので…ご注意ください。
#!/usr/bin/perl
use strict;
use warnings;
use Encode;
print "Content-Type: text/html; charset=Shift_JIS", "\n\n";
my $csvfile = "./KEN_ALL.CSV";
my (%zip,%zip2,%sort_file,@add,@duplication,@uniq,$i);
print "<html><body>";
print "ken_all:$csvfile<hr><pre>";
open(IN,"$csvfile") || &error("Open Error: $csvfile");
while (<IN>) {
$_ =~ s/"//g;
my($id,$z,$zip,$kana1,$kana2,$kana3,$pref,$add,$add2,$etc) = split(/,/);
if ( $add2 =~ s/(|)|「|」|地割|、//s) {$add2="";}#重複してるアドレス削除
my $File_id = ( $zip =~ /^([0-9]{3})/ )[0];#ファイル番号
$id = int($id/1000);#都道府県id
$add2 =~ s/以下に掲載がない場合//g;
push (@add,"$File_id,$zip,$id,$add,$add2");
}
close(IN);
@uniq = uniqArray(\@add);
foreach my $value (sort( @uniq) ){
my ($File_id,$zip,$id,$add,$add2) = split(/,/,$value);
my $address = "\"$add\",\"$add2\"";
if($zip{$zip}){$zip2{$zip} = "$File_id:\"W$id\",$zip{$zip}$address";}else{$zip2{$zip} = "$File_id:$id,$address";}#
if($address){$zip{$zip} .= "$address,";}
}
foreach my $value (sort(keys(%zip2))){#郵便番号順
my ($File_id,$add) = split(/:/,$zip2{$value});
#$i++;
#print "\n($i)$value\n$zip2{$value}";#確認用
#print "$File_id:$value:$add";#確認用
$sort_file{$File_id} .= "\"$value\":[$add],";
};
foreach my $value (sort(keys(%sort_file))){#ファイル番号順
my ($zip,$add) = split(/:/,$sort_file{$value});
$i++;
$sort_file{$value} =~ s/,$//g;
my $v = sprintf( "%03d",$i );
my $new_zip ="\{$sort_file{$value}\}";
my $File_name ="zip-" . $value . ".json";
print "\n($v)$File_name$new_zip";# JSONフォーマット確認用
$File_name = "./zipdata/$File_name";#書き込みフォルダー
#サンプルの場合は先にzipdata名でフォルダー制作
open( JSON, "> $File_name") or die "$! - $File_name\n";
$new_zip = Encode::decode("sjis", $new_zip);
$new_zip = Encode::encode("UTF-8", $new_zip );
print JSON $new_zip;
close( JSON );
#push (@duplication,"$File_name----$new_zip\n");#確認用
}
print "</body></html>";
#
#open(FH,"> data.txt");#まとめ書き出し用
#print FH @duplication;
#close(FH);
sub uniqArray{
my $array = shift;
my %hash = ();
foreach my $value ( @$array ){
$hash{$value} = 1;
}
return(
keys %hash
);
}