一昨日の続き。
IP アドレスから国名コードを調べることはできた。でも、JP とか US くらいならわかるけど、ほかは国名コードを出力されても、結局どこの国なんだかわからない。例えばおとといの cidr.txt の最後はこうなっている。
takatoh@nightschool $ tail cidr.txt ZW 196.43.96.0/19 ZW 196.43.199.0/24 ZW 196.44.176.0/20 ZW 196.201.1.0/24 ZW 196.220.96.0/19 ZW 196.223.26.0/24 ZW 197.157.204.0/22 ZW 197.214.120.0/21 ZW 197.221.224.0/19 ZW 197.231.212.0/22
ZW ってどこの国だ?
国名コードと国名のデータベース
国名コードの一覧は例えば Wikipedia にもあるので、それを調べれば ZW がどこの国かはわかる。けど、やりたいのはそんなことじゃなくて、コマンド一発で国名を出力して欲しいんだ。
まずは国名コードと国名を対応付けるデータベースが必要だ。データベースと言ってもそんな大げさなものじゃなくて CSV ファイルでいいんだけども。とはいえ、Wikipedia のページでは表になってるので、それをスクレイピングするなんてめんどくさくてやってられない。ところが、「国名コード CSV」でググったら、あるじゃないか、CSV。Qiita で公開してくれている人がいた。ありがとう、いい人だ。
cf. 国コード一覧CSV ISO 3166-1 – Qiita
というわけで、ここのページをエディタにコピペして、country_code.csv ファイルに保存した。
Rubyスクリプト
データさえ準備できれば、あとは検索するスクリプトさえ書けばいい。こんなの大して考えるまでもない。ちょちょいと書いた。
# coding: utf-8 require 'csv' def main cc_table = load_country_code("country_code.csv") cc = ARGV.shift puts cc_table[cc] end def load_country_code(csv) table = {} File.open("country_code.csv", "r") do |f| f.gets f.each do |line| fields = line.parse_csv table[fields[4]] = fields[0] end end table end main
country_code.csv がスクリプトを実行するディレクトリにあることを前提としている。
さて、試してみよう。
takatoh@nightschool $ ruby cc_to_country.rb JP 日本 takatoh@nightschool $ ruby cc_to_country.rb ZW ジンバブエ
というわけで、ZW はジンバブエでした。