LoginSignup
5
7

More than 5 years have passed since last update.

郵便番号データから都道府県・市町村リストを作成するためのスクリプト

Last updated at Posted at 2015-08-13

前提となるテーブル定義

CREATE TABLE `mst_address` (
  `officialCode` char(11) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '全国地方公共団体コード(JIS X0401、X0402)',
  `postalCode5` char(5) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '(旧)郵便番号(5桁)',
  `postalCode7` char(7) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '郵便番号(7桁)',
  `kana_pref` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '都道府県名(カタカナ)',
  `kana_city` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '市区町村名(カタカナ)',
  `kana_town` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '町域名(カタカナ)',
  `pref` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '都道府県名',
  `city` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '市区町村名',
  `town` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '町域名',
  `flag_doubleCode` tinyint(1) NOT NULL COMMENT '一町域が二以上の郵便番号で表される場合の表示 (注3) (「1」は該当、「0」は該当せず)',
  `flag_banchi` tinyint(1) NOT NULL COMMENT '小字毎に番地が起番されている町域の表示 (注4) (「1」は該当、「0」は該当せず)',
  `flag_chome` tinyint(1) NOT NULL COMMENT '丁目を有する町域の場合の表示 (「1」は該当、「0」は該当せず)',
  `flag_double_area` tinyint(1) NOT NULL COMMENT '一つの郵便番号で二以上の町域を表す場合の表示 (注5) (「1」は該当、「0」は該当せず)',
  `flag_update` int(1) NOT NULL COMMENT '更新の表示(注6)(「0」は変更なし、「1」は変更あり、「2」廃止(廃止データのみ使用))',
  `flag_update_reason` int(1) NOT NULL COMMENT '変更理由 (「0」は変更なし、「1」市政・区政・町政・分区・政令指定都市施行、「2」住居表示の実施、「3」区画整理、「4」郵便区調整等、「5」訂正、「6」廃止(廃止データのみ使用))',
  KEY `postalCode7` (`postalCode7`),
  KEY `postalCode5` (`postalCode5`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='[Master]郵便番号データファイル';
CREATE TABLE `mst_address_mini` (
  `officialCode` int(5) unsigned zerofill NOT NULL COMMENT '全国地方公共団体コード(JIS X0401、X0402)',
  `pref` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '都道府県名',
  `city` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '市区町村名',
  PRIMARY KEY (`officialCode`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='[Master]住所コード(縮小版)';

データ作成

#!/bin/bash

DBUSER=
DBPASS=
DBNAME=

echo "Downloading..."
wget -q http://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip

echo 'Melting...'
unzip -o -q ken_all.zip

echo "Convert SJIS to UTF8"
nkf -w KEN_ALL.CSV > mst_address.csv

# 元ファイルを削除
rm -f KEN_ALL.CSV

echo 'Importing to MySQL'
mysqlimport -s -u ${DBUSER} -p${DBPASS} --local --delete --fields-terminated-by=, --fields-enclosed-by="\"" --fields-escaped-by="\\" --lines-terminated-by="\r\n" ${DBNAME} mst_address.csv;
mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "TRUNCATE mst_address_mini;INSERT INTO mst_address_mini SELECT officialCode, pref, city FROM mst_address GROUP BY officialCode"

# CSV削除
rm -f KEN_ALL.CSV
rm -f mst_address.csv
rm -f ken_all.zip

jQuery を利用する前提です。

javascript
$(function () {
    var parent = $(".ajax-pref");
    var child = $(".ajax-city");
    parent.on("change", function () {
        var selectedPrefCode = $(this).val();
        var param = {
            pref: selectedPrefCode
        };
        child.html('<option value="-1">-- 市区郡選択 --</option>');
        var defaultCityCode = ("" != child.attr("default")) ? child.attr("default") : -1;

        if (-1 != selectedPrefCode) {
            $.getJSON("/ajax/getcity.php", param, function (json) {
                $.each(json, function (i) {
                    child.append(
                            '<option value="' + json[i].code + '">' +
                            json[i].name + '</option>');
                });
                child.val(defaultCityCode);
            });
        }
    }).change();
});
html
<select name="pref" class="ajax-pref">
<option value="-1">都道府県</option>
<option value="1">北海道</option>
<option value="2">青森</option><option value="47">沖縄県</option>
</select>

<select name="city" class="ajax-city">
<option value="-1">市区郡</option>
</select>

ajax/getcity.php

php
<?php
try {
    $strPrefCode = filter_input(INPUT_GET, 'pref');

    $sql = "SELECT ";
    $sql .= "`officialCode` as `code` ";
    $sql .= ", `city` as `name` ";
    $sql .= "FROM `mst_address_mini` ";
    $sql .= "WHERE 1 ";
    $sql .= "AND SUBSTRING(`officialCode`, 1, 2) = :officialCode ";
    $arr = array();
    $arr[':officialCode'] = $strPrefCode;

    $objPdo = new \PDO('mysql:dbname=testdb;host=localhost;charset=utf8'
        , $username
        , $passwd
        , array(\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION));

    $stmt = $objPdo->prepare($sql);
    $stmt->execute($arr);
    $res = $stmt->fetchAll();
} catch (Exception $e) {
    $res = array(
        'error' => $e->getMessage()
        , 'code' => $e->getCode()
    );
} finally {
    header('Content-type: application/json');
    echo json_encode($res);
}

利用データはこれ郵便番号データダウンロード

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7