空港間のマイル距離を調べるスクリプトを書いた

先週末、これまでに乗ったすべての飛行機の記録を記載しようと思い立った。

幸い飛行機に頻繁に乗るようになったのはここ2,3年の話でメールを掘り返せば予約情報もすべてわかるし、数十回程度だったので記憶からもすべて思い起こすことができた。

便名、エアライン、区間の最初と終わりを記載したのだが、せっかくだから飛行距離すなわちマイレージも記録したい。 エアライン限定であれば生涯マイレージを表示するサービスがあるが、ここは全エアラインのマイレージを合算したい。 エアラインの区間マイレージはIATAのテーブルで規定されていて、それにもとづいて計算されるらしいが、そのテーブルのデータ購入は有料で敷居が高い。 幸い MileCalc(http://www.milecalc.com) などマイレージを計算してくれるサイトはいくらでもあるので、こうしたところを利用してマイルの一覧を集めるスクリプトrubyで書いた。

require "net/http"
STDIN.read.split("\n").map{|str| str.split(/\s+/).sort.join("\t") }.uniq.each do |str|   
    from, to= str.split("\t")
    res = Net::HTTP.get(URI.parse("http://www.milecalc.com/mileage-calculator/#{from}/#{to}/"))
    begin
        mile = res.split("\n").select{|s|s.match(/distance\[0\]/)}.first.split('"')[1]
    rescue Exception => e
        mile = ""
    end
    puts "#{from}\t#{to}\t#{from}#{to}\t#{mile}"
    puts "#{to}\t#{from}\t#{to}#{from}\t#{mile}"
end   

標準入力で 3桁のIATA空港コードの組を空白で区切って入力すると、その組のマイル数をタブ区切りで返す。

  • Input
NRT LAX
  • output
LAX  NRT LAXNRT  5451
NRT LAX NRTLAX  5451

表計算VLOOKUPで探せるように、往路と復路の両方を出力するようにした。

また、Inputで空港のペアが重複していてもユニークになるようにしている。