郵便番号を住所に

三重県の郵便番号を 5140001 のような形で入力し,住所を入力しようとすると,郵便番号からわかる住所の部分が自動的に入ります。

郵便番号:
住所:

ソース

このページのソースはブラウザから見ることができます。Ajaxにかかわるところは以下の部分です:

<script src="/js/jquery.min.js"></script>
<script>
function doit() {
  $.post(
    'lookup.php',
    { zip: $('#zip').val() },
    function(x) { $('#address').val(x); }
  );
}
</script>

フォームの部分は次のようになっています:

<form action="./" method="post">
<p>郵便番号:<input name="zip" id="zip" onchange="doit();"><br>
住所:<input name="address" id="address"><br>
<input type="submit" value="送信"></p>
</form>

サーバ側の処理を行う lookup.php は次のようになっています:

<?php
  header('Content-Type: text/html; charset=UTF-8');
  if ($_POST['zip']) {
    try {
      $db = new PDO('sqlite:yuubin.db');
      $st = $db->prepare("select address from yuubin where zip=? limit 1");
      $st->execute(array($_POST['zip']));
      $a = $st->fetch();
      echo $a[0];
    } catch (PDOException $e) {
      echo "エラー";
    }
  }
?>

yuubin.dbはSQLiteのデータベースで,次のような形の表yuubinを含みます:

zipaddress
5140001三重県津市江戸橋
5140008三重県津市上浜町
…………

このような表を作る方法を以下に解説します。

解説

郵便番号データは日本郵便の郵便番号データダウンロードからダウンロードできます。何種類かありますが,どれを使ってもかまいません。以下の例では「読み仮名データの促音・拗音を小書きで表記するもの」を使いました。また,三重県のデータだけに限定しています。これは次のようなCSV形式になっています。三重県のデータだけでも2475件あります(2016年2月現在)。

24201,"514  ","5140000","ミエケン","ツシ","イカニケイサイガナイバアイ","三重県","津市","以下に掲載がない場合",0,0,0,0,0,0
24201,"514  ","5140017","ミエケン","ツシ","アイオイチョウ","三重県","津市","相生町",0,0,0,0,0,0
24201,"51411","5141139","ミエケン","ツシ","アオバダイ","三重県","津市","青葉台",0,0,1,0,0,0

3番目が7桁郵便番号,7〜9番目が住所です。これらだけをタブ区切りで取り出すには,Rならば次のようにできます:

x = read.csv("24MIE.CSV", header=FALSE) # Windows以外ではオプション fileEncoding="CP932" が必要
y = paste0(x$V3, "\t", x$V7, x$V8, x$V9)
write(y, "24mie.tsv")

Windowsの日本語環境の場合は fileEncoding="CP932" はデフォルトですので特に指定する必要はありません。また,出力は CP932(Shift JIS)になりますので,後で説明するように,文字コード変換が必要です。

同じことをRuby+CSVクラスを使うなら次のようにします(あらかじめUTF-8に変換してから行います):

require "csv"
CSV.foreach("24mie-utf8.csv") do |row|
  print row[2], "\t", row[6], row[7], row[8], "\n"
end

Windowsの日本語環境で作った場合,文字コードはShift JISになります。これをUTF-8に変換するには,いろいろな方法がありますが,UNIX(Linux)環境に送ってから,次のようにコマンドで行うのが簡単でしょう(nkfはたいていのLinuxマシンにインストールされています):

nkf -w 24mie.tsv >24mie-utf8.tsv

文字コード変換はテキストエディタでもできます。

これをデータベースに読み込ませるには,次のようにします:

sqlite3 yuubin.db
create table yuubin(zip text, address text);
.separator "\t"
.import 24mie-utf8.tsv yuubin
.quit

.separator "," とすればCSVも読めます(データ中にコンマがない場合)。

「以下に掲載がない場合」という文字列は省いておくほうがいいでしょう。どうやれば省けるか考えてください。