読者です 読者をやめる 読者になる 読者になる

Mae向きなブログ

Mae向きな日記のブログ版。ようやくこちらに移行してきました。

RubyでExcel集計

Ruby 情報処理技術者試験

RubyExcelファイルなどを操作できることを知りました。ということで,情報処理技術者試験の各都道府県別の合格者数を集計するものを作ってみました。

以下を参考にしました。

使い方は,以下のとおりです。

  1. http://www.jitec.jp/1_07toukei/_index_toukei.html から勤務先別一覧のExcelファイルをダウンロードする。
  2. 基本情報技術者試験の高校生の各都道府県の合格状況は"AZ45"のセルを集計すれば良いので,以下のように実行する。-c がセルを指定するオプションです。
  3. ruby ipa_toukei.rb -c az45 kimusaki_19a_adfe.xls
#
# Usage: ruby ipa_toukei.rb -c az45 kimusaki_19a_adfe.xls
# 
require 'win32ole'
require 'optparse'
$KCODE = "SJIS"

def getAbsolutePath(filename)
  fso = WIN32OLE.new('Scripting.FileSystemObject')
  return fso.GetAbsolutePathName(filename)
end

def openExcelWorkbook(filename)
  filename = getAbsolutePath(filename)
  xl = WIN32OLE.new('Excel.Application')
  xl.Visible = false
  book = xl.Workbooks.Open({'filename'=> filename, 'readOnly' => true})
  begin
    yield book
  ensure
    xl.Workbooks.Close
    xl.Quit
  end
end

### Main
cell = nil
opt = OptionParser.new
opt.on("-c String") {|v| cell = v}
file = opt.parse!(ARGV).shift
hash = Hash.new

openExcelWorkbook(file) do |book|
  book.Worksheets.each do |sheet|
    next if sheet.name == '全国' 
    hash[sheet.name] = sheet.Range(cell).Value.to_i
  end
end

hash.sort{|a, b| b[1] <=> a[1]}.each do |elem|
  printf("%5d %s\n", elem[1], elem[0])
end

以下が実行例です。

   34 愛知県
   31 静岡県
   23 岐阜県
   21 新潟県
   17 埼玉県
   14 宮城県
   13 宮崎県
   13 佐賀県
   11 鹿児島県
   10 群馬県
   …(以下省略)