Ruby

国民の祝日の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