古い記事
ランダムジャンプ
新しい記事
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

ソースを入手(後述)。
データ作成mkybdata.pl
検索CGIybks.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 を使うと大丈夫なのですが、それはまた今度。