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 ファイルは以下のような構成になっている。
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Number | Pref. | Total | Male | Female |
| 2 | 01 | 北海道 | 5320 | 2506 | 2814 |
| 3 | 02 | 青森県 | 1278 | 600 | 678 |
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 を利用すればよい。
コマンドライン引数から県名を得るには 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)
も全く同じように処理できるので,データ作成の自由度が高い。