【发布时间】:2019-08-10 19:54:21
【问题描述】:
我想在 Ruby on Rails 中将哈希转换为自定义格式的 csv。
输入哈希:
[{"Date"=>"2019-03-18", "Date Hour"=>"2019-03-18 00:00", "Price"=>"14"}, {"Date"=>"2019-03-18", "Date Hour"=>"2019-03-18 01:00", "Price"=>"13"}, {"Date"=>"2019-03-18", "Date Hour"=>"2019-03-18 02:00", "Price"=>"14"}, {"Date"=>"2019-03-18", "Date Hour"=>"2019-03-18 03:00", "Price"=>"19"}, {"Date"=>"2019-03-18", "Date Hour"=>"2019-03-18 04:00", "Price"=>"28"}, {"Date"=>"2019-03-18", "Date Hour"=>"2019-03-18 05:00", "Price"=>"24"}, {"Date"=>"2019-03-18", "Date Hour"=>"2019-03-18 06:00", "Price"=>"21"},
{"Date"=>"2019-03-19", "Date Hour"=>"2019-03-19 00:00", "Price"=>"16"}, {"Date"=>"2019-03-19", "Date Hour"=>"2019-03-19 01:00", "Price"=>"10"}, {"Date"=>"2019-03-19", "Date Hour"=>"2019-03-19 02:00", "Price"=>"11"}, {"Date"=>"2019-03-19", "Date Hour"=>"2019-03-19 03:00", "Price"=>"14"}, {"Date"=>"2019-03-19", "Date Hour"=>"2019-03-19 04:00", "Price"=>"26"}, {"Date"=>"2019-03-19", "Date Hour"=>"2019-03-19 05:00", "Price"=>"22"},
{"Date"=>"2019-03-19", "Date Hour"=>"2019-03-19 06:00", "Price"=>"25"}
预期输出:
Date,Date Hour,Mar-18,Mar-19
2019-01-01,00:00,14,16
2019-01-01,01:00,13,10
2019-01-01,02:00,14,11
2019-01-01,03:00,19,14
2019-01-01,04:00,28,26
2019-01-01,05:00,24,22
2019-01-01,06:00,21,25
当前输入的哈希有 2 个日期,它可能包含多个日期值。根据上述输入,我想构建具有上述预期输出的 csv?
我怎样才能得到上述预期的输出?
更新:这是我的代码。但我的代码只适用于一天的数据。如果输入 csv 中有多天的数据,我该如何增强它?
# Convert csv to hash
rows = CSV.parse(response, headers: true).map(&:to_h)
# Add transformation in hash
rows.each do |hash|
# Remove Hour from Date Hour values
hash["Date Hour"] = hash["Date Hour"].gsub!(hash["Date"], "").strip
# Replace Price column name with date value (e.g Mar-19)
hash[Date.parse(hash["Date"]).strftime("%b-%d")] = hash.delete("Price")
# Set static Date
hash["Date"] = "2019-01-01"
end
# Convert hash to csv
# Extract column names from first row of data
column_names = rows.first.keys
# Generate CSV after transformation of csv
csv_response = CSV.generate do |csv|
csv << column_names
rows.each do |row|
# Extract values for row of data
csv << row.values_at(*column_names)
end
end
【问题讨论】:
-
请展示您已经尝试过的内容。 SO 不是免费为您编写代码的服务。
-
此外,不清楚为什么预期输出的日期为
Jan 1, 2019,小时数的来源。此外,您的输入是无效的红宝石。 -
@AlekseiMatiushkin 我已经更新了这个问题。请看一看。 2019 年 1 月 1 日是一个静态日期值。
标签: ruby-on-rails ruby csv hash