郵便番号を住所に

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

郵便番号:
住所:

ソース

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

<script type="text/javascript" src="/js/prototype.js"></script>
<script type="text/javascript">
// <![CDATA[
function doit() {
  new Ajax.Request('lookup.php', {
    method: 'get',
    parameters: { 'zip' : $('zip').value },
    onSuccess: function(x) { $('address').value = x.responseText }
  });
}
// ]]>
</script>

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

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

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

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

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

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

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

解説

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

24201,"514  ","5140001","ミエケン","ツシ","エドバシ","三重県","津市","江戸橋",0,0,1,0,0,0
24201,"514  ","5140008","ミエケン","ツシ","カミハマチョウ","三重県","津市","上浜町",0,0,1,0,0,0
24201,"51401","5140102","ミエケン","ツシ","クリママチヤチョウ","三重県","津市","栗真町屋町",0,0,0,0,0,0

3番目が郵便番号,7〜9番目が住所です。文字コードはShift JISですので,必要に応じて他の文字コードに変換します。例えばUTF-8・全角カナに変換するには次のようにします:

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

これらだけをタブ区切りで取り出すには,例えばRuby+CSVクラスを使うなら次のようにします:

require "csv"
CSV.open("24mie-utf8.csv", 'r') { |row|
  print row[2], "\t", row[6], row[7], row[8], "\n"
}

データベースに格納するには,あらかじめ次のような表を作っておきます。以下はSQLiteの例です:

sqlite3 yuubin.db
create table yuubin(zip text, address text);
.quit

これに

insert into yuubin values("5140001", "三重県津市江戸橋");

のような形式("' でもよい)でデータを入れていくわけですが,このような形のテキストファイルを次のプログラムで生成しておきます(津市のデータに限ることにします):

require "csv"
CSV.open("24mie-utf8.csv", 'r') { |row|
  puts "insert into yuubin values('#{row[2]}', '#{row[6..8]}');"
}

このプログラムをyuubin.rbという名前で作り,

ruby yuubin.rb >yuubin.sql

のようにしてyuubin.sqlというファイルに出力します。これをリダイレクトしてsqliteコマンドに与えます:

sqlite3 yuubin.db <yuubin.sql

あるいは次のようにすれば中間のファイルyuubin.sqlを作る必要もなくなります:

ruby yuubin.rb | sqlite yuubin.db

奥村晴彦

Last modified: 2011-02-03 11:22:06