路線・駅データのyml生成

駅、路線データを無償提供しているサイト「駅データ.jp」さんがあったのでrubyでデータを変換してymlに出力してみた。
出力データに合致するDBスキーマがあれば「rake db:fixtures:load」でDBに一発でロードできます。

データ提供サイトはこちら
駅データ

「駅データ.jp」さん最高です!

  • やり方

データを上記サイトの「ダウンロード」からファイルをダウンロードして解凍します。

解凍されたデータm_stations.csv(EUC)をnkfでutf8に変換しstation.csvという名前で保存する。

nkf -w m_staions.csv > station.csv

fastercsvを使っているのでインストールしていなければ

gem install fastercsv


後は後述のコードをUTF8にしたCSVと同じディレクトリで実行するだけ。

  • 入力データ  station.csv
  • 出力データ  stations.yml(駅), railroad_lines.yml(路線)


以下は山手線、目黒線南北線三田線を抽出します。


#!/usr/bin/env ruby
require "rubygems"
require "fastercsv"
COLLECT_LIST = [
              "JR山手線",
              "東急目黒線",
              "東京メトロ南北線",
              "都営三田線"
              ]

station_list  = Array.new
station_id = 0
railroad_list = Array.new
railroad_id = 0

FasterCSV.foreach("station.csv") do |row|

  railroad = row[8]
  if COLLECT_LIST.include? railroad
    station  = row[9]

    railroad_item = { :label => railroad_id,
                      :id => railroad_id,
                      :name => railroad}

    unless railroad_list.include? railroad_item
      railroad_id = railroad_id + 1
      railroad_item[:label] = railroad_id
      railroad_item[:id] = railroad_id
      railroad_list.push railroad_item
    end

    station_id = station_id + 1
    station_list.push({ :label => station_id,
                        :id => station_id,
                        :name => station,
                        :railroad_id => railroad_id})

  end
end

File.open("stations.yml", "w") do |file|
  station_list.each do |item|
    file.puts item[:label].to_s + ":"
    file.puts "  id: " + item[:id].to_s
    file.puts "  name: " + item[:name]
    file.puts "  railroad_line_id: " + item[:railroad_id].to_s
  end
end

File.open("railroad_lines.yml", "w") do |file|
  railroad_list.each do |item|
    file.puts item[:label].to_s + ":"
    file.puts "  id: " + item[:id].to_s
    file.puts "  name: " + item[:name]
  end
end

出力結果

stations.yml

1:
  id: 1
  name: JR山手線
2:
  id: 2
  name: 東急目黒線
3:
  id: 3
  name: 東京メトロ南北線
4:
  id: 4
  name: 都営三田線

railroad_lines.yml

1:
  id: 1
  name: 大崎
  railroad_line_id: 1
2:
  id: 2
  name: 五反田
  railroad_line_id: 1
3:
  id: 3
  name: 目黒
  railroad_line_id: 1
4:
  id: 4
  name: 恵比寿
  railroad_line_id: 1
5:
  id: 5
  name: 渋谷
  railroad_line_id: 1
以下省略

出力する路線を増やしたい場合はCOLLECT_LISTの項目を足せばOK!!

そのうち関連する駅のグループも変換したいな…。