ODS処理のヒント

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

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

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

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

ABCDE
1NumberPref.TotalMaleFemale
201北海道532025062814
302青森県1278600678

1行目がヘッダになっているので CSV.parseheaders: 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 を利用すればよい。

コマンドライン引数から県名を得るには ARGV配列を利用するとよい。

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

irb
require 'roo'
require 'csv'		# この2行は必要
ods = Roo::Spreadsheet.open("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

Roo::Spreadsheet.open メソッドはExcelファイル(.xlsx) も全く同じように処理できるので,データ作成の自由度が高い。


本日の課題