三重県の郵便番号を 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']) {
$db = sqlite_open('yuubin.db') or die('データベースがありません');
$sql = "select address from yuubin where zip={$_GET['zip']};";
$a = sqlite_array_query($db, $sql, SQLITE_NUM) or die('見つかりません');
echo $a[0][0];
}
?>
yuubin.dbはSQLiteのデータベースで,次のような形の表yuubinを含みます:
| zip | address |
|---|---|
| 5140001 | 三重県津市江戸橋 |
| 5140008 | 三重県津市上浜町 |
| …… | …… |
このような表を作る方法を以下に解説します。
郵便番号データは日本郵便の郵便番号データダウンロードからダウンロードできます。以下では三重県のデータだけ扱います。これは次のようなCSV形式になっています。三重県のデータだけでも2462件あります(2008年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の例です:
sqlite yuubin.db create table yuubin(zip text, address text); .quit
これに
insert into yuubin values("5140001", "三重県津市江戸橋");
のような形式(" は ' でもよい)でデータを入れていくわけですが,このような形のテキストファイルを次のプログラムで生成しておきます(津市のデータに限ることにします):
require "csv"
CSV.open("24mie-utf8.csv", 'r') { |row|
if row[7] == '津市'
print 'insert into yuubin values("', row[2], '", "', row[6], row[7], row[8], '");', "\n"
end
}
printのところは次のように書いてもかまいません:
puts "insert into yuubin values('#{row[2]}', '#{row[6..8]}');"
このプログラムをyuubin.rbという名前で作り,
ruby yuubin.rb >yuubin.sql
のようにしてyuubin.sqlというファイルに出力します。これをリダイレクトしてsqliteコマンドに与えます:
sqlite yuubin.db <yuubin.sql
あるいは次のようにすれば中間のファイルyuubin.sqlを作る必要もなくなります:
ruby yuubin.rb | sqlite yuubin.db
Last modified: 2008-01-05 20:57:49