日本全国の郵便番号&住所データDBを作る方法
「郵便番号データダウンロード - 日本郵便」でオープンソースとして配布されている「郵便番号&住所データ」(CSVファイル:全国版は12万行で12MB)を使えば、誰でも簡単に日本全国の郵便番号&住所DBを作れます。
RailsでDBにデータを入れるなら、ActiveRecord::Extentions使って一気にDBに入れてやればいいだけです。(CSVファイルはSHIFT_JISなので、DBに入れる際にデータをUTF-8に変換するのを忘れずに!)
データをCSVからDBに取り組む為のコードはこんな感じ。
-
require 'fastercsv'
-
require 'kconv'
-
require 'ar-extensions'
-
$KCODE='j'
-
-
address_list = Array.new
-
FasterCSV.foreach("KEN_ALL.CSV") do |data|
-
address_list <<[ data[2].toutf8, data[6].toutf8, data[7].toutf8, data[8].toutf8 ]
-
end
-
-
column = [:zipcode, :prefecture, :city, :address]
-
Address.import(column, address_list)
上のコードだと、僕のMacBookの場合、全国版のデータでも大体1分程で登録が完了します。
僕はこれをrakeタスクで簡単に登録できるようにしてます。
と、ここまでは比較的楽なのですが、実は「郵便番号データダウンロード - 日本郵便」のデータ形式がくせ者です。
「〒150-0013」(東京都渋谷区恵比寿)で検索すると、以下のように余計な文字列が入っています...
都道府県:東京都
市区町村:渋谷区
住所:恵比寿(以下のビルを除く)
原因はこれ。ガーデンプレイスは各階で郵便番号が異なるのか!?
-
+---------+--------------------------------------------+
-
| zipcode | address
-
+---------+--------------------------------------------+
-
| 1500013 | 恵比寿(以下のビルを除く)
-
| 1506001 | 恵比寿恵比寿ガーデンプレイス
-
| 1506002 | 恵比寿恵比寿ガーデンプレイス
-
:
-
(中略)
-
:
-
| 1506039 | 恵比寿恵比寿ガーデンプレイス
-
+---------+--------------------------------------------+
しかし住所欄に「(以下のビルを除く)」とか...
こんなの備考欄でも作ってそこに入れろ!
とか思いながら、しかたが無いので対処しました。
- 全角括弧以降の文字列は削除する。
- 住所欄が全角数字から始まる時は住所欄を空白にする。
- 郵便番号の下一桁が0の列は削除する。
修正後のコードは以下。
-
require 'fastercsv'
-
require 'kconv'
-
require 'ar-extensions'
-
$KCODE='j'
-
-
address_list = Array.new
-
FasterCSV.foreach("KEN_ALL.CSV") do |data|
-
address_list <<[ data[2].toutf8, data[6].toutf8, data[7].toutf8, data[8].toutf8.gsub(/^[0-9].*$|(.*$/u,"") ] unless data[2].toutf8=~/[0-9]{6}0/
-
end
-
-
column = [:zipcode, :prefecture, :city, :address]
-
Address.import(column, address_list)
これで問題解決かな?
12万件はさすがにチェックしてないですが。
※ 旧字体の使用について
昔はこのデータに旧字体が含まれていたらしいのですが、現在は日本郵便のサイトで「旧字体はひらがな表記してる」的なことを書いてたので、大丈夫だと思います。
(追記)
ここにある機能をまとめて、JpAddressプラグインとして公開しました。
使い方はプラグインに含まれているREADMEをご覧ください。
なんかわかんなかったらコメントください。
RubyForge: JpAddress: Project Info
JpAddress - 郵便番号/住所変換用のRailsプラグイン
(さらに追記)
下記のサイトを参考にすれば、PHPでこれと同じことができそうです。
[PostgreSQL] 郵便番号辞書をデータベースに投入する手順












この記事がお役に立ちましたら、一言コメントもらえると嬉しいですm_ _m