おぎろぐはてブロ

なんだかんだエンジニアになって10年以上

郵便番号データのサマライズをするスクリプト

前回の記事で、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申し込みとかで番地まで細分化されてるデータがあるけど、ああいうのがあればいいのかな。あれって、どこのデータなんだろ。これかなぁ。。