【问题标题】:Ruby convert hash to histogram in csvRuby在csv中将哈希转换为直方图
【发布时间】:2016-09-26 11:30:18
【问题描述】:

我有一个看起来像这样的哈希:

@histogram = {
  "Date 1" => [
     {"Item 1" => 1},
     {"Item 4" => 3}
  ],
  "Date 2" => [
     {"Item 2" => 7},
     {"Item 1" => 2},
     {"Item 5" => 1}
  ],
  "Date 3" => [
     {"Item 4" => 3},
     {"Item 2" => 2},
     {"Item 8" => 1},
     {"Item 1" => 5}
  ]
}

我想将其转换为如下所示的逐日直方图 CSV 文件:

|        | Date 1 | Date 2 | Date 3 |
| Item 1 |   1    |   2    |   5    |
| Item 2 |        |   7    |   2    |
| Item 4 |   3    |        |   3    |
| Item 5 |        |   1    |        |
| Item 8 |        |        |   8    |

让我感到困惑的是@histogram 哈希可能完全不正常。日期 (keys) 可能是有序的,但项目将完全乱序。此外,如您所见,不同日期的项目不必相同。如果某个项目在特定日期不存在,则可以假设它在直方图中的数量为 0。

【问题讨论】:

  • 似乎您必须在临时数据结构中对该哈希的内容进行一些重新打包,以便更轻松地构建 CSV。假设你接受了这个想法并付诸实施。我想知道你能生成什么样的代码。
  • 对于您的第一个问题 - 您可以使用排序。对于第二个 - 事先获得键的联合。

标签: ruby-on-rails ruby csv hash


【解决方案1】:

我认为拥有Date1 值的哈希数组没有多大意义,它很可能是具有多个键的单个哈希。 @histogram 的结构最好如下所示:

{"Date 1"=>{"Item 1"=>1, "Item 4"=>3},
 "Date 2"=>{"Item 2"=>7, "Item 1"=>2, "Item 5"=>1},
 "Date 3"=>{"Item 4"=>3, "Item 2"=>2, "Item 8"=>1, "Item 1"=>5}}

因此,我将提供将@histogram 转换为上述结构并以此为基础的解决方案。

processed_hash = @histogram.map {|k,v| [k, v.reduce(&:merge)]}.to_h

column_headers =  processed_hash.keys
row_headers = processed_hash.flat_map{ |k, v| v.keys}.uniq.sort

print "|" + "".center(10) + "|"
column_headers.each {|ch| print ch.center(10) + "|"}
puts
row_headers.each do |rh|
  print "|" +  rh.center(10) + "|"
  column_headers.each {|ch| print processed_hash.dig(ch, rh).to_s.center(10) + "|"}
  puts
end

输出:

|          |  Date 1  |  Date 2  |  Date 3  |
|  Item 1  |    1     |    2     |    5     |
|  Item 2  |          |    7     |    2     |
|  Item 4  |    3     |          |    3     |
|  Item 5  |          |    1     |          |
|  Item 8  |          |          |    1     |

【讨论】:

    猜你喜欢
    • 2020-12-22
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2010-12-11
    • 2018-03-20
    • 2020-09-15
    相关资源
    最近更新 更多