2014年10月5日日曜日

郵便番号データ+検索について考えてみた

郵便番号データ、郵便番号検索についてエントリをしてみようと思う。

この郵便番号データってやつは、様々なアプリで必要な場面が多い。
日本郵便が提供していてダウンロード可能であるが、市区町村統廃合等の理由により月1度なり最新化されるので、 ある時点で取得しても、そのうち最新データでなくなってしまう。

こういった問題の解決方法の一つとして、AjaxZip3 というプロダクトもあって メンテナンスも AjaxZip3 側でしていただけるので、 コレを使えば、郵便番号検索は凄く簡単に実装出来るし、常に最新のデータを参照出来る。

自分もこの AjaxZip3 は 5年前ぐらいから数回使っていて、 便利だなと思う。
しかし、個人的にただ一つ物足りないのは、郵便番号7ケタ入力しないと住所補完してくれない点。
Google 日本語入力 のようなサジェスト機能を用いて、インクリメンタル検索出来れば、もっと使いやすいなと個人的には思う。

AjaxZip3 が対応してくれれば嬉しいんだけど、たぶんこの先も対応されないと思うので、常に最新の郵便番号データを使いつつ(※1)、郵便番号検索する際はインクリメンタルに出来るようにする(※2)には、自分で実装するしか手立ては無さそう。

※1 はお決まりな方法やけど、実際に作ってみた。
※2 は別の機会に公開するかも。

[動作環境]

  • CentOS release 6.5 (Final)
  • MySQL 5.1.73
#!/bin/sh
# ====================================================================
# $Id$
#
# Description:
#  郵政省郵便番号(zip_codes) を最新化します。
#
# Usage:
#   ./renew_zipcodes.sh
#
# Date        Author      Description
# --------------------------------------------------------------------
# 2014-10-05  Seiji Hojo  新規作成
#
# ====================================================================

# 設定ファイル読み込み
. "./config/renew_zipcodes.ini"

# ====================================================================
# 前処理
# ====================================================================

# clean
find ${TMP_DIR} \( -name "KEN_ALL.CSV" -o -name "ken_all.zip" \) -print0 | \
xargs -0 --no-run-if-empty rm 2>/dev/null

# ====================================================================
# 本処理
# ====================================================================

# zip ファイル取得
wget ${ZIP_ALL_URL} -P ${TMP_DIR}

# zip 解凍
cd ${TMP_DIR}
unzip $(basename ${ZIP_ALL_URL})

# テーブル再作成
${MYSQL_CMD} < ${SQL_DIR}"/drop-create-zipcodes.sql"

# データ投入
${MYSQL_CMD} <<SQL

-- Shift_JIS ファイルを読み込む
SET character_set_database=sjis;

-- 郵政省郵便番号(zip_codes) に最新データ投入
LOAD DATA INFILE "/tmp/KEN_ALL.CSV"
INTO TABLE zip_codes
FIELDS
    TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '"'
LINES
    TERMINATED BY '\r\n'
IGNORE 0 LINES
;

-- 「以下に掲載がない場合」は消す
UPDATE zip_codes
SET address = NULL
WHERE address = '以下に掲載がない場合'
;

SQL

# ====================================================================
# 後処理
# ====================================================================

# clean
find ${TMP_DIR} \( -name "KEN_ALL.CSV" -o -name "ken_all.zip" \) -print0 | \
xargs -0 --no-run-if-empty rm 2>/dev/null

# end
exit 0


[補足・注意]
コピーして使っても構いませんが、一切責任持ちません。
動作テストはしてますが、cron 実行とかはまだ試していません。

[参考]
AjaxZip3
https://code.google.com/p/ajaxzip3/
AjaxZip3 設置サンプル(お試し出来ます)
http://ninkigumi.com/ajaxzip3/
郵便番号データダウンロード - 日本郵便
http://www.post.japanpost.jp/zipcode/download.html

0 コメント :

コメントを投稿