Edited at

国民の祝日のCSVをいい感じに変換するRubyスクリプト

More than 1 year has passed since last update.

※ 2017/03/01時点で、元のCSVが修正されて正規化しちゃいましたので、このスクリプトは不要になりました。

こちら

http://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html

で公開されている、CSVがなかなか扱いづらいということで、ちょっとしたデータベース設計の演習問題として扱ってみます。

まず、内閣府からは以下のようなCSVが与えられています。

SS 2017-02-26 16.16.31.png

扱いづらいとろを上げてみます。


  • 平成と西暦の併記がパースしづらい

  • 名称、月日などの同じ意味の列が横に並んでる(縦に並ぶのが正解)

  • 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

SS 2017-02-26 16.23.49.png