郵便番号APIを自作してみる。

郵便番号の検索には郵便番号API (http://zip.cgis.biz/)

なんかがあるのだが、ローカル環境で郵便番号から住所(の途中まで)を入力する機会があったため、よく分からないなりに郵便番号APIを自作してみる。
SQLなんてろくにさわったこともない。


必要な物

  • 郵便番号データ
  • XAMP or LAMLP or MAMP


方向性としては、

  1. 郵便番号のCSVデータを日本郵便のサイトからダウンロード
  2. CSVSQL文に変換
  3. mySQLにぶっ込む
  4. phpでスクリプトを作成

1、郵便番号CSVデータをダウンロード

日本郵便のサイトからCSVデータをダウンロード
ダウンロード先

特に事情が無い限り全国一括がらくちん。
ちなみにデータが多すぎて、エクセルでは途中までしか開けなかった。
データの説明が、ここから読めるのだが、必要なのは7桁の郵便番号と住所データだけ。他は見なかった事に。

2、CSVSQL文に変換

参考サイト
参考というか、どんぴしゃなのでそのままで、

以下のファイルを、KEN_ALL.CSVと同じフォルダにおいて、

perl csv2sql.pl

を実行。

csv2sql.pl

#!/usr/local/bin/perl

# WindowsでCSVをSQLのINSERTに変換する例
#
# http://www.post.japanpost.jp/zipcode/dl/oogaki.html の全国郵便番号データを利用
# 名前が"zip"、フィールド数がCSVと同数で全て文字列型のテーブルと仮定
# 
# 【変換前】
# 01101,"064  ","0640941","ホツカイドウ","サツポロシチユウオウク","アサヒガオカ"
# ,"北海道","札幌市中央区","旭ケ丘",0,0,1,0,0,0
#
# 【変換後】
# INSERT INTO zip VALUES('01101','064','0640941','ホツカイドウ','サツポロシチユウオウク','アサヒガオカ'
# ,'北海道','札幌市中央区','旭ケ丘','0','0','1','0','0','0');
#
# 上記礼は表示上改行を入れていますが、実際のデータは1行です。
#
open CSV,"KEN_ALL.CSV";
open SQL,">KEN_ALL.SQL";

$cnt=0;
while (<CSV>) {
    $cnt++;
    s/\s//g;
    s/\"//g;
    s/,/','/g;
    print SQL qq(INSERT INTO zipcode VALUES('$_');\n);
}
print $cnt;

close CSV;
close SQL;

で、KEN_ALL.SQLが出来上がるはず。私の場合はUTF-8にしたかったので、その後文字コードを変換。

3、mySQLにぶっ込む

zipcodeテーブルを作成。

CREATEコマンドは使わずphpMyAdminから地道に。
データ自体は、さっき作ったKEN_ALL.SQLをインポート。
文字の照合順序をutf8_unicode_ciにしなきゃ、文字化けするっぽい。
f:id:asus4:20090927165200p:image


KEN_ALL.SQL

INSERT INTO zipcode VALUES('01101','060','0600000','ホッカイドウ','サッポロシチュウオウク','イカニケイサイガナイバアイ','北海道','札幌市中央区','以下に掲載がない場合','0','0','0','0','0','0');
INSERT INTO zipcode VALUES('01101','064','0640941','ホッカイドウ','サッポロシチュウオウク','アサヒガオカ','北海道','札幌市中央区','旭ケ丘','0','0','1','0','0','0');
INSERT INTO zipcode VALUES('01101','060','0600041','ホッカイドウ','サッポロシチュウオウク','オオドオリヒガシ','北海道','札幌市中央区','大通東','0','0','1','0','0','0');
INSERT INTO zipcode VALUES('01101','060','0600042','ホッカイドウ','サッポロシチュウオウク','オオドオリニシ(1-19チョウメ)','北海道','札幌市中央区','大通西(1〜19丁目)','1','0','1','0','0','0');
....
...
..

をインポート。しばらく待つ。とテーブルが出来上がるはず。

4、PHPスクリプトを作る。


zipcode.php

<?php
// get zipcode
$zipcode = $_GET['zipcode'];



// connect MySQL
$sqlId = mysql_connect("localhost:8889", "root", "root");
mysql_query("SET NAMES utf8"); // change utf8
mysql_select_db( "database_hogehoge", $sqlId );


$query = "SELECT Prefecuture, City, Address FROM zipcode WHERE Zip_Code = '". $zipcode ."';";


$queryId = mysql_query($query, $sqlId);
$result = mysql_fetch_object($queryId);


// close mysql
mysql_close($sqlId);


echo "郵便番号 : " . $zipcode . "<br />";

$pref = $result->Prefecuture;
$city = $result->City;
$addr = $result->Address;

echo "住所 : ". $pref ." ". $city ." ".$addr."<br />";

mysql_free_result($queryId);

?>


ということで http://localhost:8888/zipcode.php?zipcode=1060045
とかやると、麻布十番の住所が表示されたりするのだ。

ちなみに、文字化け対策として
mysql_query("SET NAMES utf8"); // change utf8
の一文をいれるので、かなりなやむ。文字化けのない英語圏がうらやまれます。
XMLで返すとかはめんどいのでまた今度。