Japanese ZIP data converter (日本の郵便番号データのコンバータ)
日本郵便(郵便事業株式会社) が提供している 郵便番号データ から、 MySQL のデータベースを作成(または保守)するための SQL ファイルを生成するプログラム。
元データ(日本郵便の CSV データ)は、よく知られているように、プログラマの目から見て、非常に不細工な仕様に基づいたデータになっている。 この CSV データを、何も考えずに、単純にデータベースにインポートすると、酷い目にあうことになる。
当プログラムは、この元データを可能な限り合理的なデータに変換して、MySQL のデータベースに格納するためのものである。
- PHP 5.X (CLI) or PHP 7.x (CLI)
+ programs ... プログラム
zipconv.php ... メインの実行ファイル
ZipDataDownloader.php ... 郵便番号データダウンローダ
ZipDataConverter.php ... コンバータ
ZipDataCommon.php ... 郵便番号データ(基底)
ZipData.php ... 郵便番号データ(一般)
ZipBizData.php ... 郵便番号データ(大口事業所個別番号データ)
KanaDic.php ... 振り仮名辞書データ
zipup.sh ... データ更新シェル・スクリプト(サンプル)
+ sqls ... SQL
zip_data_init.sql ... 初期テーブル作成
zip_data_flag_update.sql ... フラグ更新
+ kana_dics ... 振り仮名辞書
pref.csv ... 都道府県名辞書データ
town.csv ... 市区町村名辞書データ
block.csv ... 町域名辞書データ
+ data ... ソース・データ、作業ディレクトリ
+ 2008 ... 2020年8月
+ work ... 作業ディレクトリ
+ 2009 ... 2020年9月
+ work ... 作業ディレクトリ
+ YYMM ... 一般に、20YY年MM月
+ work ... 作業ディレクトリ
+ outputs ... 出力ディレクトリ
+ masters ... マスター SQL
+ 2008 ... 2020年8月
00-zipdata.sql ... 単一マスター・データ
01-ken_all-01.sql ... 分割マスター・データ:全国データ1
02-ken_all-02.sql ... 分割マスター・データ:全国データ2
03-ken_all-03.sql ... 分割マスター・データ:全国データ3
04-ken_all-04.sql ... 分割マスター・データ:全国データ4
05-ken_all-05.sql ... 分割マスター・データ:全国データ5
06-ken_all-06.sql ... 分割マスター・データ:全国データ6
07-jigyosyo-01.sql ... 分割マスター・データ:個別事業所データ1
08-jigyosyo-02.sql ... 分割マスター・データ:個別事業所データ2
+ 2009 ... 2020年9月
+ YYMM ... 一般に20YY年MM月
+ updates ... 更新用 SQL
update_2008.sql ... 2020年8月
update_2009.sql ... 2020年9月
update_YYMM.sql ... 一般に20YY年MM月
- programs/zipconv.php を実行する
- 引数に、ダウンロードモード "all" と年月 YYMM を指定する。 例えば、2020年12月なら、"php zipconv.php all 2012"
- ただし、その月の25日以降かつ次の月の24日以前なら、年月 YYMM は省略可能。 "php zipconv.php all"
- outputs/masters/YYMM ディレクトリに生成されたマスター・データ
00-zipdata.sql
を DB にインポートする- リモートからファイルをアップロードする場合は、分割マスター・データを
01
から08
まで番号順に DB にインポートする (最初にテーブルの初期化を行い、最後にフラグ・データの更新を行っているので、最初と最後だけは順番を守る必要がある)
- リモートからファイルをアップロードする場合は、分割マスター・データを
- programs/zipconv.php を実行する
- 引数に、ダウンロードモード "diff" と年月 YYMM を指定する。 例えば、2020年12月なら、"php zipconv.php diff 2012"
- ただし、その月の25日以降かつ次の月の24日以前なら、年月 YYMM は省略可能であり、 デフォルトのダウンロードモードである "diff" も省略してよい。 "php zipconv.php"
- outputs/updates ディレクトリに生成された update_YYMM.sql を DB にインポートする
月次データ更新をするためには、初期データ登録後、その前の月まで、一度も欠かさずに月次データ更新をしていなければならない。
programs/zipup.sh は linux 環境でデータベースを月次更新するスクリプトのサンプルである。
- 複数行にわたって記述されているデータを一行にまとめる。
- そのままでは扱いづらい「町域」のデータを、block と street という二つのデータに分割する。
- 大口事業所個別番号のデータについて、可能な限り、「都道府県名」「市区町村名」「町域名」の「振り仮名」を補完する。
- 「同一の町域が複数の郵便番号を持つ場合」および「同一の郵便番号が複数の町域にまたがる場合」のフラグについて、間違いを修正するスクリプトを提供。
- 元データにおけるこれらのフラグは、全然、信用できない。
- テーブル構造については、sqls/zip_data_init.sql を参照。
- コンバート時に、「町域」が、block と street に分離されていることに注意。
- 具体的には、「町域」のデータが単一の地域を示すものでない場合に、それを street に移動している。
- 例えば、「町域」が「○○、○○」のように複数の地域を列挙している場合や、「○○〜○○」のように地域の範囲を指定している場合に、 それらを全て street に移動する。
- また、「町域」に '(' と ')' で囲んで追記されている部分がある場合、'()' の中を street に移動し、それ以外を block に 残す。
- street および street_kana の表示には注意が必要である。
- 複数の地名が '、' で連結されている場合がある。
- さらに、各地名は、「」 または <> に囲まれた「A、B、...、Xを除く」という複数の例外を含む場合がある。
- 「以下に掲載がない場合」、「○○以外」、「○○一円」など、地名ではないものが記載されている場合がある。
- street_kana がデータとして提供されていない場合がある(特に京都市の中心部)。
- 要するに、street および street_kana は、そのまま使用すべき「住所」の構成要素ではなくて、 「住所」と郵便番号の対応関係を説明する「但し書き」「補足説明」として表示すべきものである。
- ただし、大口事業所個別番号データの場合は、street は block に続く正式な住所データとして扱うことが出来る。
- MySQL のテーブル・タイプは、このデータでは、 MyISAM がお奨め。
- InnoDB でも作ってみたが、検索に要する時間が目に見えて長かった。
ここで作成した MySQL の郵便番号データ・テーブルの使用例として、以下のものを挙げる。
- [郵便番号案内@softark.net] (https://tools.softark.net/zipdata)
- [郵便番号検索サービス@softark.net] (https://tools.softark.net/zipdata/api)
先人の業績として参照すべきものをいくつか挙げる。
2011-05-01 初稿 / 2020-09-23 更新