国名コードから国名を調べる

一昨日の続き。
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 はジンバブエでした。