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)
も全く同じように処理できるので,データ作成の自由度が高い。