郵便番号データのサマライズをするスクリプト
前回の記事で、kuさんからリクエストあったので、データというかPHPスクリプトを。(データは更新されるから古くなっちゃうし)
郵便番号データダウンロード - 日本郵便から、全国一括のTSVをダウンロード、解凍して、下のスクリプトに食わせてください。 (「以下に掲載がない場合」を削るときは適宜TSVのエンコードを合わせておいてください)
<?php $fp = fopen('KEN_ALL.CSV', 'r'); while (($line = fgetcsv($fp)) !== FALSE) { $line = array($line[2], $line[6], $line[7], $line[8]); if ($line[3] == '以下に掲載がない場合') array_pop($line); $p =& $data[$line[0]]; if (empty($p)) { $p = $line; } else { $tmp = $p; $p = array(); foreach($tmp as $c) { $d = array_shift($line); if ($c != $d) { break; } $p[] = $c; } } } fclose($fp); foreach ($data as $line) { echo implode("\t", $line), "\n"; } ?>
どうせならやってみたいと思ったこと
ユニークになるように削ることで、今度は同じ住所に対して、違う郵便番号がいくつも対応するようになる。MOTTAINAI。
0691300 北海道 夕張郡長沼町 0691316 北海道 夕張郡長沼町 0691336 北海道 夕張郡長沼町 0691304 北海道 夕張郡長沼町 ...
これを、
| zip | A | +-------+-----+ |0691300| 138 | |0691316| 138 | |0691336| 138 | | A | B | +-----+--------+ | 138 | 10, 35 | | B | | +---+------------+ | 10|北海道 | |...| ... | | 35|夕張郡長沼町|
同じ住所になるところを2レベルで階層化したら、データサイズがどれくらい少なくなるか。
ただ、作っても用途がないよね。思いつくのはJavaScriptでクライアント側に埋め込みくらいだけれど、それは、素直にXHRでサーバに問い合わせに行った方がよいと思うし。
気になったもの
住所自動入力で、これが出てるのはちょっといけてない。
6496413 和歌山県 紀の川市 竹房(450番地以下) 6496162 和歌山県 紀の川市 竹房(451番地以上)
どちらも全国地方公共団体コードが 30208 で同じ。このコード表で住所をひっぱって判定するのもありかもしれないけれど、オフィシャルでは有償でしか配布されていない。
こういう、住所入力補助としてはまずいものが結構あるのかもなぁ。。
追記
全国地方公共団体コードだと、郵便番号による住所データより荒くなっちゃうんだよね。地図とか、ADSL申し込みとかで番地まで細分化されてるデータがあるけど、ああいうのがあればいいのかな。あれって、どこのデータなんだろ。これかなぁ。。