郵便番号の検索には郵便番号API (http://zip.cgis.biz/)
なんかがあるのだが、ローカル環境で郵便番号から住所(の途中まで)を入力する機会があったため、よく分からないなりに郵便番号APIを自作してみる。
SQLなんてろくにさわったこともない。
必要な物
- 郵便番号データ
- XAMP or LAMLP or MAMP
方向性としては、
1、郵便番号CSVデータをダウンロード
日本郵便のサイトからCSVデータをダウンロード
ダウンロード先
特に事情が無い限り全国一括がらくちん。
ちなみにデータが多すぎて、エクセルでは途中までしか開けなかった。
データの説明が、ここから読めるのだが、必要なのは7桁の郵便番号と住所データだけ。他は見なかった事に。
2、CSVをSQL文に変換
参考サイト
参考というか、どんぴしゃなのでそのままで、
以下のファイルを、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;
3、mySQLにぶっ込む
zipcodeテーブルを作成。
CREATEコマンドは使わずphpMyAdminから地道に。
データ自体は、さっき作ったKEN_ALL.SQLをインポート。
文字の照合順序をutf8_unicode_ciにしなきゃ、文字化けするっぽい。
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で返すとかはめんどいのでまた今度。