📝 BLOG.IK.AM

@making's memo
(🗃 Categories 🏷 Tags)

郵便番号から住所検索するためのデータ投入自動化

🗃 {Middleware/RDBMS/PostgreSQL}

🗓 Updated at 2011-10-09T07:13:22+09:00 by Toshiaki Maki  🗓 Created at 2011-10-09T07:13:22+09:00 by Toshiaki Maki  {✒️️ Edit  ⏰ History}


💣 Danger: This content is obsolete. You should avoid reading. If you really want to read, please click .

登録フォームでよくあるやつ。

日本郵便のページからCSVデータを取ってきて、
PostgreSQLにつっこむところまで。

PostgreSQL意外は適宜読み替えて

DDL(zipcode.ddl)

一応DB名もzipcodeで。

DROP TABLE IF EXISTS zipcode;

CREATE TABLE zipcode
(
  "jis_x0401_cd" character(5) NOT NULL, -- 全国地方公共団体コード(JIS X0401、X0402)
  "old_zip_cd" character(5) NOT NULL, -- (旧)郵便番号(5桁)
  "zip_cd" character(7) NOT NULL, -- 郵便番号(7桁)
  "prefecture_name_kana" character varying(30) NOT NULL, -- 都道府県名
  "city_name_kana" character varying(90) NOT NULL, -- 市区町村名
  "town_area_name_kana" character varying(256) NOT NULL, -- 町域名
  "prefecture_name" character varying(30) NOT NULL, -- 都道府県名
  "city_name" character varying(90) NOT NULL, -- 市区町村名
  "town_area_name" character varying(120) NOT NULL, -- 町域名
  "one_town_area_many_zip_cd_flg" character(1) NOT NULL, -- 一町域が二以上の郵便番号で表される場合の表示
  "one_area_one_block_no_flg" character(1) NOT NULL, -- 小字毎に番地が起番されている町域の表示
  "section_exist_flg" character(1) NOT NULL, -- 丁目を有する町域の場合の表示
  "one_zip_cd_many_town_area_flg" character(1) NOT NULL, -- 一つの郵便番号で二以上の町域を表す場合の表示
  "add_zip_cd_update_type" character(1) NOT NULL, -- 更新の表示
  "add_zip_cd_change_reason_cd" character(1) NOT NULL -- 変更理由
);

CREATE INDEX "idx_zipCode" ON zipcode USING btree("zip_cd");

自動化スクリプト

#!/bin/sh
URL="http://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip"
ZIP_OUTPUT=/tmp/ken_all.zip
ZIP_EX_DIR=`pwd`/ken_all
wget ${URL} --output-document=${ZIP_OUTPUT}
unzip -o ${ZIP_OUTPUT} -d ${ZIP_EX_DIR}
# UTF-8化したい場合は以下も
#nkf -u -S -w -x ${ZIP_EX_DIR}/KEN_ALL.CSV > ${ZIP_EX_DIR}/UTF8_KEN_ALL.CSV
psql zipcode -f zipcode.ddl
echo "copy zipcode from '${ZIP_EX_DIR}/KEN_ALL.CSV' with csv;" > load-data.sql
psql zipcode -f load-data.sql

あとはzipcodeを受けてjson返すプログラム書けばおk。