ruby 駅データ.jp(www.ekidata.jp)で配布されているデータをいい感じにHashに合成する
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ruby 駅データ.jp(www.ekidata.jp)で配布されているデータをいい感じにHashに合成する相关的知识,希望对你有一定的参考价值。
require 'csv'
require 'pp' # pretty print
module EkidataJp;end
module EkidataJp::Exception;end
class EkidataJp::Exception::NoPresentStationCsvHeader < StandardError
def message
'Please specify some of EkidataJp::CombineStationNameAndPref#station_csv_headers'
end
end
# ekidata.jp からダウンロードした2ファイル(駅名一覧、都道府県)を合成する
class EkidataJp::CombineStationNameAndPref
attr_reader :station_csv_path, :pref_csv_path
# @param station_csv_path [string]
# @param pref_csv_path [string]
# @param headers [Array<Symbol>]
def initialize(station_csv_path:, pref_csv_path:, headers: )
@station_csv_path = station_csv_path
@pref_csv_path = pref_csv_path
@station_name_table = parse_station_csv(headers)
end
# @return [Array<Symbol>]
# 駅名CSVのヘッダを返す
def station_csv_headers
CSV.table(@station_csv_path).headers
end
# @return [Array<Hash>]
# 2つのCSVファイル(駅名一覧、都道府県)を合成して返す
def combine_station_and_pref
@station_name_table.map do |arr|
h = arr.inject({}) { |hash, values| hash.merge(values) }
h.merge(pref_name: find_pref_name(h[:pref_cd]))
end
end
# 駅名CSV をパース 1つ以上の指定されたヘッダキーを返す
def parse_station_csv(*header_keys)
header_keys.flatten!
raise EkidataJp::Exception::NoPresentStationCsvHeader if header_keys.size.zero?
header_keys << :pref_cd unless header_keys.include?(:pref_cd)
@station_name_table ||=
CSV.table(@station_csv_path).map do |row|
header_keys.map { |key| { key => row.field(key) } }
end
@station_name_table
end
# 都道府県CSV をパース 都道府県名とそれに対応するコードを返す
def parse_pref_csv
@pref_table =
CSV.table(@pref_csv_path).map do |row|
{
pref_cd: row.field(:pref_cd),
pref_name: row.field(:pref_name)
}
end
end
# 指定されたpref_cd と対応する都道府県名を返す
def find_pref_name(pref_cd)
parse_pref_csv if @pref_table.nil?
@pref_table.find { |hash| hash[:pref_cd].eql?(pref_cd) }[:pref_name]
end
end
pref_csv_path = '/path/to/pref.csv'
station_csv_path = '/path/to/stationyyyymmddfree.csv'
e = EkidataJp::CombineStationNameAndPref.new(station_csv_path: station_csv_path, pref_csv_path: pref_csv_path, headers: %i(station_name))
pp e.combine_station_and_pref
以上是关于ruby 駅データ.jp(www.ekidata.jp)で配布されているデータをいい感じにHashに合成する的主要内容,如果未能解决你的问题,请参考以下文章
ruby ARC 033-Cデータ构造
ruby 二つの枚举を外部イテレーターの机能で突き合わせを行いマージする
ruby ターミナルとかでファイルの削除リストを提示された时に使う。
ruby 再帰处理で再试行してみる。データ取得は他の关数にやらせるといいかも。
有名なプールサイド (エンジニアが死滅シタ世界)
ruby タイムゾーンの指定による时刻の変换来自http://d.hatena.ne.jp/tonkoh/20080901/1220287952