※ 2017/03/01時点で、元のCSVが修正されて正規化しちゃいましたので、このスクリプトは不要になりました。
こちら
http://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html
で公開されている、CSVがなかなか扱いづらいということで、ちょっとしたデータベース設計の演習問題として扱ってみます。
まず、内閣府からは以下のようなCSVが与えられています。
扱いづらいとろを上げてみます。
- 平成と西暦の併記がパースしづらい
- 名称、月日などの同じ意味の列が横に並んでる(縦に並ぶのが正解)
- SJISなので、ターミナルで見づらい
ということで、加工してみたサンプルがこちら。
require "open-uri"
url = "http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv"
puts "\uFEFF名称,月日"
open(url).each.with_index{|line,idx|
next if idx == 0 or idx == 1
line.chomp!
line.encode!("utf-8","sjis")
cols = line.split(",")
while true
out = cols.shift(2)
break if out.first.to_s == ""
puts out.join(",")
end
}
解説
- open-url でファイルのようにWeb上のコンテンツを開く
- ファイル先頭にBOMをつけて、UTF8であってもエクセルでダブルクリックで文字化けしないように(もちろんUTF8なのでMacやLinuxでも扱いやすいように)
- SJISからUTF8に変換
- 1行目と2行目はスキップ
- カンマでsplitすると、6カラム取得されるので、2カラムずつ出力
- 空行がでてきたらそこで終了
- データの並び順や年のグルーピング情報はCSVには保持しない
実行方法
$ ruby shukujitu.rb > out.csv