/jzip-conv

Japanese ZIP data converter

Primary LanguagePHPBSD 2-Clause "Simplified" LicenseBSD-2-Clause

jzip-conv

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月

プログラムの使い方 (1) 初期データ登録

  1. programs/zipconv.php を実行する
    • 引数に、ダウンロードモード "all" と年月 YYMM を指定する。 例えば、2020年12月なら、"php zipconv.php all 2012"
    • ただし、その月の25日以降かつ次の月の24日以前なら、年月 YYMM は省略可能。 "php zipconv.php all"
  2. outputs/masters/YYMM ディレクトリに生成されたマスター・データ 00-zipdata.sql を DB にインポートする
    • リモートからファイルをアップロードする場合は、分割マスター・データを 01 から 08 まで番号順に DB にインポートする (最初にテーブルの初期化を行い、最後にフラグ・データの更新を行っているので、最初と最後だけは順番を守る必要がある)

プログラムの使い方 (2) 月次データ更新

  1. programs/zipconv.php を実行する
    • 引数に、ダウンロードモード "diff" と年月 YYMM を指定する。 例えば、2020年12月なら、"php zipconv.php diff 2012"
    • ただし、その月の25日以降かつ次の月の24日以前なら、年月 YYMM は省略可能であり、 デフォルトのダウンロードモードである "diff" も省略してよい。 "php zipconv.php"
  2. outputs/updates ディレクトリに生成された update_YYMM.sql を DB にインポートする

月次データ更新をするためには、初期データ登録後、その前の月まで、一度も欠かさずに月次データ更新をしていなければならない。

programs/zipup.sh は linux 環境でデータベースを月次更新するスクリプトのサンプルである。

データ変換の要点

  • 複数行にわたって記述されているデータを一行にまとめる。
  • そのままでは扱いづらい「町域」のデータを、block と street という二つのデータに分割する。
  • 大口事業所個別番号のデータについて、可能な限り、「都道府県名」「市区町村名」「町域名」の「振り仮名」を補完する。
  • 「同一の町域が複数の郵便番号を持つ場合」および「同一の郵便番号が複数の町域にまたがる場合」のフラグについて、間違いを修正するスクリプトを提供。
    • 元データにおけるこれらのフラグは、全然、信用できない。

生成される MySQL データベース・テーブルの使い方

  • テーブル構造については、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 の郵便番号データ・テーブルの使用例として、以下のものを挙げる。

リンク

先人の業績として参照すべきものをいくつか挙げる。

2011-05-01 初稿 / 2020-09-23 更新