Ruby - 如何将大型,多维的哈希数组转换为CSV格式

时间:2016-02-12 07:09:03

标签: ruby csv multidimensional-array hash

我有一大堆哈希(存储在“@hash [”response“] [”r​​esults“])”“由我的程序以JSON格式返回。

我已经在Stack Overflow上看到了关于如何将简单哈希转换为CSV格式的几个例子,但是我找不到任何使用更大数据集来做这个事情的复杂例子。

我想使用哈希键("pluginID""ip""pluginName"等)作为CSV标头和哈希值("11112",{{ 1}},"100.100.100.100"等)用于CSV行内容。

请注意,"Name for plugin here"键本身就是一个哈希值,为此,我只想使用名称,而不是ID或描述。

非常感谢任何帮助。我按照Ruby CSV标准库说明使用了一些代码示例,但我甚至没有接近。

"repository"

2 个答案:

答案 0 :(得分:2)

我使用了类似的解决方案:

stats_rows = @hash["responce"]["results"].each_with_object([]) do |e, memo|
  memo << [e["pluginID"], e["ip"], e["pluginName"]]
end
CSV.generate do |csv|
  csv << ["pluginID", "ip", "pluginName"] #puts your hash keys into SCV
  stats_rows.each do |row| #values
     csv << row
  end
end

答案 1 :(得分:2)

这很简单。基本上有五个步骤:

  1. 将JSON解析为Ruby Hash。
  2. "results"数组的第一个哈希中获取密钥名称,并将其作为标题写入CSV文件。
  3. 迭代"results"数组和每个哈希:

    1. "repository"哈希值替换为"name"值。
    2. 以与标题相同的顺序提取值,并将其写入CSV文件。
  4. 代码看起来像这样:

    require 'json'
    require 'csv'
    
    json = '{
      "type": "regular",
      "response": {
        ...
      },
      ...
    }'
    
    # Parse the JSON
    hash = JSON.parse(json)
    
    # Get the Hash we're interested in
    results = hash['response']['results']
    
    # Get the key names to use as headers
    headers = results[0].keys
    
    filename = "/path/to/output.csv"
    
    CSV.open(filename, 'w', headers: :first_row) do |csv|
      # Write the headers to the CSV
      csv << headers
    
      # Iterate over the "results" hashes
      results.each do |result|
        # Replace the "repository" hash with its "name" value
        result['repository'] = result['repository']['name']
    
        # Get the values in the same order as the headers and write them to the CSV
        csv << result.values_at(*headers)
      end
    end
    

    此代码(headers = results[0].keys)假定第一个"results"哈希将包含您在CSV中所需的所有密钥。如果不是这种情况,您需要:

    1. 明确指定标题,例如:

      headers = %w[ pluginId ip pluginName ... ]
      
    2. 遍历所有哈希并构建一个所有键的列表:

      headers = results.reduce([]) {|all_keys, result| all_keys | result.keys }