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 ファイルは以下のような構成になっている。
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
1 | Number | Pref. | Pref.(Roman) | Total | Male | Female |
2 | 01 | 北海道 | Hokkaido | 5382 | 2537 | 2845 |
3 | 02 | 青森県 | Aomori-ken | 1308 | 615 | 694 |
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