簡體   English   中英

在Ruby on Rails中以自定義格式將哈希轉換為csv

[英]Transformation on hash to csv in custom format in Ruby on Rails

我想在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

首先轉換您的輸入:

result =
  input.group_by do |hash|
    hash["Date Hour"].split.last
  end.values.map do |arr|
    arr.each_with_object({}) do |h, acc|
      acc["Date"] ||= "2019-01-01"
      acc["Date Hour"] ||= h["Date Hour"].split.last
      acc[Date.iso8601(h["Date"]).strftime('%b-%d')] = h["Price"]
    end
  end

#⇒ [{"Date"=>"2019-01-01", "Date Hour"=>"00:00", "Mar-18"=>"14", "Mar-19"=>"16"},
#   {"Date"=>"2019-01-01", "Date Hour"=>"01:00", "Mar-18"=>"13", "Mar-19"=>"10"},
#   {"Date"=>"2019-01-01", "Date Hour"=>"02:00", "Mar-18"=>"14", "Mar-19"=>"11"},
#   {"Date"=>"2019-01-01", "Date Hour"=>"03:00", "Mar-18"=>"19", "Mar-19"=>"14"},
#   {"Date"=>"2019-01-01", "Date Hour"=>"04:00", "Mar-18"=>"28", "Mar-19"=>"26"},
#   {"Date"=>"2019-01-01", "Date Hour"=>"05:00", "Mar-18"=>"24", "Mar-19"=>"22"},
#   {"Date"=>"2019-01-01", "Date Hour"=>"06:00", "Mar-18"=>"21", "Mar-19"=>"25"}]

現在,將其吐出為CSV。


無恥的插件:一個人可以使用SeeAsVee gem從一系列哈希中生成一個CSV文件:

require 'see_as_vee'
SeeAsVee.csv result
#⇒ #<File:/tmp/am/see_as_vee20190320-10403-ub0p5y.csv>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM