郵便番号をMySQLに

投稿日:

ゆうびんホームページでは「郵便番号データ」として、郵便番号と住所等を対応させたデータを配布してくれています。コレがあると郵便番号→住所の変換ができるので、このデータをMySQLに読み込んでみる事にしました。

とりあえず元となるデータが無いと始まらないので、郵便番号等のダウンロードから郵便番号のデータを頂いて来ます。今回はよみがな部分を使う予定が無いので、拗音や撥音の小書きはどっちでも構いません。「ホツカイドウ」でも「ホッカイドウ」でもどーせ使わないし(^_^;)

頂いて来た全国版のデータを頂いて来て書庫を解凍すると、(lzh圧縮と言う事でイヤな予感はしてましたが:^^;)

・文字コード:シフトJIS
・改行:CR+LF
・よみがな部分:半角カタカナ
・カンマ区切り、2重引用符囲み

というとってもWindowsなデータ(^^;が出て来ました。これはLinux上のMySQLで扱うのに向いた形式のデータとはとても言えませんが、変換すること自体は大した手間じゃないので、さっさと変換して読み込んじゃう事にします。

(実はphpMyAdinが使えるならどんな形式のデータでもそのままイッパツ読み込みなんですが、全国版の郵便番号データは12MBとかある→PHPで書かれてるphpMyAdminでは「メモリ使用無制限」を指定してもダメだったんで、諦めてコマンドラインで作業します:^^;)

まず、文字コードをシフトJISからEUCに変換/LF改行とします。nkfでは半角カナ→全角カナ変換がデフォルト動作(変換を抑止するためのオプションがある)なんで、これは特に指定しなくてもOKなハズ。

$ nkf -e -Lu <KEN_ALL.CSV >zipcode.csv

Windowsでは当たり前な「"」(2重引用符)囲みも今回はちょっと邪魔なので、データ中の「"」を全てnullに置換して抹殺します。

$ sed -e 's/"//g' zipcode.csv >newzipcode.csv

(パイプを使って一発処理せずわざわざ中間ファイルを経由してるのは、ワタシがタコで先見の明がまったくないため。一度読み込んだら「"」までバッチリ読み込まれちゃって、己の阿呆さに愕然としながらやり直しております:^^;)

これで、流し込むべきデータの下ごしらえは完了(^_^)

続いて、データを流し込むテーブルを作成します。テーブル名は(何も考えることなく)「zipcode」としました。

#
# テーブルの構造 `zipcode`
#

CREATE TABLE `zipcode` (
`jiscode` varchar(5) NOT NULL default '',
`oldzipcode` varchar(6) NOT NULL default '',
`zipcode` varchar(10) NOT NULL default '',
`pref_kana` varchar(255) NOT NULL default '',
`city_kana` varchar(255) NOT NULL default '',
`town_kana` varchar(255) NOT NULL default '',
`pref` varchar(255) NOT NULL default '',
`city` varchar(100) NOT NULL default '',
`town` varchar(100) NOT NULL default '',
`etc1` char(2) NOT NULL default '',
`etc2` char(2) NOT NULL default '',
`etc3` char(2) NOT NULL default '',
`etc4` char(2) NOT NULL default '',
`etc5` char(2) NOT NULL default '',
`etc6` char(2) NOT NULL default '',
KEY `zipcode` (`zipcode`)
) TYPE=MyISAM;

自分で言うのもなんですが、実に適当(^_^;) 後半は住所の記載方法とか重複の有無とかを示すフラグデータなのですが、どーせ使わない→直後にフィールドごと捨てちゃうつもり(流し込み時にエラーを出さないためだけに作成してる)なんで、etc1〜6とか、まともなフィールド名すら付けてません(^^;;

どーんと流し込みます。

$ mysql -u root -p (データベース名)
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 124 to server version: 3.23.52-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> load data local infile 'newzipcode.csv' into table zipcode fields terminated by ',';
Query OK, 121641 rows affected (7.48 sec)
レコード数: 121641 削除: 0 Skipped: 0 Warnings: 0

mysql>

どーも↑この書き方は新しいMySQLでは通らないらしいんですが、今回使ってる(古い)MySQLでは通りました。

その後レンタルサーバの乗り換えによって「通らない」サーバにデータを流し込み直すハメになったので、新しい書き方もメモ。

mysqlimport --local --fields-terminated-by=',' zipcode newzipcode.csv

ということで、目出度く12万行の郵便番号データがデータベースに格納された→郵便番号を変換するアプリケーションを作成する準備が整ったことになります。


CGIToolBoxさんにて「zip2add」という凄いフリースクリプトを見つけてしまいました。データファイルを工夫して分割しとく事により、perlだけで(実用的な負荷&速度で)変換出来ちゃう→コレならわざわざデータベースを持ちだす事もないです(^_^;)

まぁワタシの場合は「データーベースの勉強」といったニュアンスも強い→データベースを持ち出す理由も無い訳ではないんすけどね。