さあ、港湾の数を数えろ

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

プログラム

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

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

  def start_element(name, attrs)
    @mode = name if %w{ksj:HBC ksj:NA4 ksj:AD7}.include?(name)
  end

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

  def end_element(name)
    case name
    when 'ksj:CK01'
      print [@code, @name, @adm].join(' '), "\n"
      (@code, @name, @adm) = [nil, nil, nil]
    when 'ksj:HBC'
      @buf = '0' + @buf if @buf.size == 4
      @code = @buf
    when 'ksj:NA4'
      @name = @buf + ''
    when 'ksj:AD7'
      @adm = @buf
    end 
    @buf = ''
    @mode = nil
  end

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

Parser.new.run

処理結果

$ ruby count_ports.rb > wc -l
    1034

結論

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