gawk で「最寄り駅Webサービス」
LL Future のプロモーションビデオに出てくる「最寄り駅Webサービス」の API を使った最寄り駅検索は既にご覧になられたでしょうか?
同じ物を gawk で作ってみたいと思います。簡単な API のため gawk からも簡単に呼び出すことができます。
#! /usr/bin/gawk -f
# moyorieki.awk - use "moyori eki web service" api.
BEGIN {
ORS = RS = "\r\n\r\n";
base_url = "map.simpleapi.net";
url = "stationapi";
http_url = "/inet/tcp/0/" base_url "/80";
str = "GET http://" base_url "/" url "?p=" ARGV[1];
print str " HTTP/1.0" |& http_url;
while ((http_url |& getline) > 0) {
print $0 > "moyorieki.txt";
}
close(http_url);
close("moyorieki.txt");
ORS = RS = "\n";
while (getline < "moyorieki.txt" > 0) {
if ($0 ~ /\%PAGE_BODY%lt;name\%PAGE_BODY%gt;/) {
sub(/<[a-z]*>/, ""); sub(/<\/[a-z]*>/, ""); sub(/^ */, "");
idx = $0;
station[idx] = $0;
}
if ($0 ~ /\%PAGE_BODY%lt;line\%PAGE_BODY%gt;/) {
sub(/<[a-z]*>/, ""); sub(/<\/[a-z]*>/, ""); sub(/^ */, "");
line[idx] = $0;
}
if ($0 ~ /\%PAGE_BODY%lt;direction\%PAGE_BODY%gt;/) {
sub(/<[a-z]*>/, ""); sub(/<\/[a-z]*>/, ""); sub(/^ */, "");
direction[idx] = $0;
}
if ($0 ~ /\%PAGE_BODY%lt;distanceM\%PAGE_BODY%gt;/) {
sub(/<[a-zA-Z]*>/, ""); sub(/<\/[a-zA-Z]*>/, ""); sub(/^ */, "");
distance[idx] = $0;
}
if ($0 ~ /\%PAGE_BODY%lt;traveltime\%PAGE_BODY%gt;/) {
sub(/<[a-zA-Z]*>/, ""); sub(/<\/[a-zA-Z]*>/, ""); sub(/^ */, "");
traveltime[idx] = $0;
}
}
close("moyorieki.txt");
for (i in station) {
print station[i] "(" line[i] ") " direction[i] " "\
distance[i] " " traveltime[i];
}
}
使い方も同じように引数に地名を使います。
$ gawk -f moyorieki.awk なかのzero 東中野駅(JR中央本線ほか) 東 1,240m 徒歩17分以上 中野駅(JR中央本線ほか) 南西 820m 徒歩11分以上 新井薬師前駅(西武新宿線) 北 1,230m 徒歩17分以上 中野坂上駅(東京メトロ丸ノ内線ほか) 南東 1,280m 徒歩18分以上 中野新橋駅(東京メトロ丸ノ内線(方南町支線)) 南 1,420m 徒歩20分以上 新中野駅(東京メトロ丸ノ内線) 南西 830m 徒歩11分以上
gawk の機能だけを使っているため、XML の扱いがイマイチですが、gawk は実行ファイルひとつで全ての機能が使えるため、他の言語よりも環境を選ばないと言えるでしょう。
ちなみに改行コードが "\n" であっても認識しているようなので、以下のようなコードでも同じ結果が得られました。
#! /usr/bin/gawk -f
# moyorieki.awk - use "moyori eki web service" api.
BEGIN {
base_url = "map.simpleapi.net";
url = "stationapi";
http_url = "/inet/tcp/0/" base_url "/80";
str = "GET http://" base_url "/" url "?p=" ARGV[1];
print str " HTTP/1.0" |& http_url;
print "" |& http_url;
while ((http_url |& getline) > 0) {
if ($0 ~ /\%PAGE_BODY%lt;name\%PAGE_BODY%gt;/) {
sub(/<[a-z]*>/, ""); sub(/<\/[a-z]*>/, ""); sub(/^ */, "");
idx = $0;
station[idx] = $0;
}
if ($0 ~ /\%PAGE_BODY%lt;line\%PAGE_BODY%gt;/) {
sub(/<[a-z]*>/, ""); sub(/<\/[a-z]*>/, ""); sub(/^ */, "");
line[idx] = $0;
}
if ($0 ~ /\%PAGE_BODY%lt;direction\%PAGE_BODY%gt;/) {
sub(/<[a-z]*>/, ""); sub(/<\/[a-z]*>/, ""); sub(/^ */, "");
direction[idx] = $0;
}
if ($0 ~ /\%PAGE_BODY%lt;distanceM\%PAGE_BODY%gt;/) {
sub(/<[a-zA-Z]*>/, ""); sub(/<\/[a-zA-Z]*>/, ""); sub(/^ */, "");
distance[idx] = $0;
}
if ($0 ~ /\%PAGE_BODY%lt;traveltime\%PAGE_BODY%gt;/) {
sub(/<[a-zA-Z]*>/, ""); sub(/<\/[a-zA-Z]*>/, ""); sub(/^ */, "");
traveltime[idx] = $0;
}
}
close(http_url);
for (i in station) {
print station[i] "(" line[i] ") " direction[i] " "\
distance[i] " " traveltime[i];
}
}


