ODS処理のヒント

rooを利用し、以下のようにすると ods ファイルを CVS オブジェクトに変換できる。

#!/usr/bin/env ruby
# coding: utf-8
require 'csv'
require 'roo'

# Roo::OpenOffice.new() でODSファイルをロードする
ods = Roo::OpenOffice.new("odsファイル名")
# ODSファイルオブジェクト.to_csv するとCSV文字列に変換され、
# それを CSV.parse() メソッドに渡すとCSVオブジェクトに変換される。
csv = CSV.parse(ods.to_csv, :headers => true)

pref-pops.ods ファイルは以下のような構成になっている。

ABCDEF
1NumberPref.Pref.(Roman) TotalMaleFemale
201北海道Hokkaido 538225372845
302青森県Aomori-ken 1308615694

1行目がヘッダになっているので CSV.parse:headers => true を渡して CSV オブジェクトに変換し、これを csv 変数に入れることで、見出し(列)の値をキーにして値が取り出せるようになる。 つまり、

csv.each do |row|
  print row[列名]
  # たとえば row["Total"]とするとすべての行の総人口が取り出せる
end

のようにすると特定の列の値を得ることができる。 今回のODSファイルでは、都道府県名が "Pref." というキーから取り出せるので、

csv.each do |row|
  if 正規表現 =~ row["Pref."]
    printf(....., row["Total"])
  end
end

のようにして特定の都道府県の人口(単位千人)を取り出せる。

文字列から正規表現を生成するには

regexp = Regexp.new(文字列)

のように Regexp.new を利用すればよい。

irbで以下のように順を追って実行して 結果をみるとどうしたらよいか方針が見えて来る。

irb
require 'roo'
require 'csv'		# この2行は必要
ods = Roo::OpenOffice.new("pref-pops.ods")
csv = CSV.parse(ods.to_csv, :headers => true)
csv[0]			# 北海道が見えるはず
csv[1]			# 青森県が見えるはず
csv[5]["Pref."]		# 何が出る?
csv[5]["Total"]		# 何が出る?
csv.each do |row|
  puts row["Pref."]
end


本日の課題