郵便番号検索 ybks 公開、というか再公開
2006-04-23-2
[Programming]
SUFARY を使った簡単で高速な郵便番号検索 CGI です。
昔作ったのですが、また作ってみたのでソースともども公開します。
郵便番号検索 ybks
http://ta2o.net/tools/ybks/ybks.cgi
■歴史
1998年、NAIST(大学院)にいたときに作って、
「速い! 7桁郵便番号検索」という名前で公開していました。
- 1998.6.30 : https://nikki.chalow.net/19980630.html
- Yahoo!検索 : 郵便番号検索 たつをの日記
- Google検索 : 郵便番号検索 たつをの日記
web.archive.org にあった一番古いもの(1998.12.3):

■設置方法
必要なもの。
- SUFARY http://ta2o.net/tools/sufary/ および、
その Perl モジュール。
- nkf, lha, wget
ソースを入手(後述)。
データの準備。
ybks.cgi 中の $ybdata を設定。
■参考
- 簡単なテキスト検索 CGI の雛型(古めです)
http://ta2o.net/tools/stct/
- 郵便番号等のダウンロード(使った郵便番号データ)
http://www.post.japanpost.jp/zipcode/download.html
http://www.post.japanpost.jp/zipcode/dl/kogaki.html
- [を] Suffix Array の解説文書のリンク集[2006-04-10-3]
SUFARYで用いているアルゴリズム。
■ソース
mkybdata.pl (文字コードは EUC-JP)
ybks.cgi (文字コードは EUC-JP)
れることがあります。とはいえ、実用上は問題ないと思います。
SUFARY.pm とともに DID.pm を使うと大丈夫なのですが、それはまた今度。
昔作ったのですが、また作ってみたのでソースともども公開します。
郵便番号検索 ybks
http://ta2o.net/tools/ybks/ybks.cgi
■歴史
1998年、NAIST(大学院)にいたときに作って、
「速い! 7桁郵便番号検索」という名前で公開していました。
- 1998.6.30 : https://nikki.chalow.net/19980630.html
- Yahoo!検索 : 郵便番号検索 たつをの日記
- Google検索 : 郵便番号検索 たつをの日記
web.archive.org にあった一番古いもの(1998.12.3):

■設置方法
必要なもの。
- SUFARY http://ta2o.net/tools/sufary/ および、
その Perl モジュール。
- nkf, lha, wget
ソースを入手(後述)。
| データ作成 | mkybdata.pl |
| 検索CGI | ybks.cgi |
データの準備。
wget http://www.post.japanpost.jp/zipcode/dl/kogaki/lzh/ken_all.lzh lha x ken_all.lzh nkf -e ken_all.csv | mkybdata.pl > ybdata mkary ybdata
ybks.cgi 中の $ybdata を設定。
■参考
- 簡単なテキスト検索 CGI の雛型(古めです)
http://ta2o.net/tools/stct/
- 郵便番号等のダウンロード(使った郵便番号データ)
http://www.post.japanpost.jp/zipcode/download.html
http://www.post.japanpost.jp/zipcode/dl/kogaki.html
- [を] Suffix Array の解説文書のリンク集[2006-04-10-3]
SUFARYで用いているアルゴリズム。
■ソース
mkybdata.pl (文字コードは EUC-JP)
#!/usr/bin/perl
use strict;
use warnings;
while (<>) {
my @c = split(/"?,"?/, $_);
die if (@c != 15);
$c[8] =~ s/以下に.+$/*/;
print $c[2]." ".join("", @c[6,7,8])."\n";
}
※ワンライナーでいいじゃん、というレベル。汎用性なし。ybks.cgi (文字コードは EUC-JP)
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use SUFARY;
my $ybdata = "/home/yto/ybks/ybdata";
my $suf = SUFARY->new($ybdata);
my $q = new CGI;
my $key = $q->param('key') || "";
print $q->header(-charset => 'EUC-JP');
print $q->start_html(-title=>'郵便番号検索 ybks');
print $q->h1('郵便番号検索 ybks');
print $q->startform(-method => 'GET', -name => 'myform'),
$q->textfield('key'), $q->submit('search'), $q->endform;
search_and_print($suf, $key) unless ($key =~ /^\s*$/);
print $q->end_html(), "\n";
sub search_and_print {
my ($suf, $key) = @_;
my @res = $suf->search($key);
print "<pre>", scalar(@res), "件見つかりました。\n\n";
for my $i (0..$#res) {
if ($i == 999) {
print "\nヒット数が多いのでここまで!\n";
last;
}
my $str = $suf->get_line($res[$i]);
$str =~ s!($key)!<span style="background-color:pink">$1</span>!g;
printf "<b>%3d</b>. %s", $i + 1, $str;
}
print "</pre>";
}
※現在のバージョンでは検索キーワードを複数含む住所は、複数回表示されることがあります。とはいえ、実用上は問題ないと思います。
SUFARY.pm とともに DID.pm を使うと大丈夫なのですが、それはまた今度。
