さあ、空港の数を数えろ

国土数値情報(空港データ、平成19年度)に存在する空港の個数を数えてみました。
五歳男児の流行語をタイトルに借りて、簡単な Ruby プログラムを組んで処理してみました。

プログラム

# -*- coding: utf-8 -*-
# count_airports.rb
require 'rubygems'
require 'zip/zip'
require 'nokogiri'

class Parser < Nokogiri::XML::SAX::Document
  def initialize
    @mode = nil
    @buf = ''
    @code = nil
    @name = nil
    @city = nil
  end

  def start_element(name, attrs)
    @mode = name if %w{ksj:AIC ksj:NA3 ksj:AAC}.include?(name)
  end

  def characters(text)
    @buf += text if @mode
  end

  def end_element(name)
    case name
    when 'ksj:CF02'
      print [@city, @name, @code].join(' '), "\n"
      (@code, @name, @city) = [nil, nil, nil]
    when 'ksj:AIC'
      @buf = '0' + @buf if @buf.size == 4
      @code = @buf
    when 'ksj:NA3'
      @name = @buf + ''
    when 'ksj:AAC'
      @city = @buf
    end 
    @buf = ''
    @mode = nil
  end

  def run
    Zip::ZipFile.open('../../../src/ksj/airport/C28-07.zip') {|z|
      Nokogiri::XML::SAX::Parser.new(self).parse(
        z.get_input_stream(z.get_entry('C28-07.xml')))
    }
  end
end

Parser.new.run

処理結果

$ ruby count_airports.rb > wc -l
       97

結論

国土数値情報によると、日本の空港は97程度あるようです。