我有一大堆哈希(存储在“@hash [”response“] [”results“])”“由我的程序以JSON格式返回。
我已经在Stack Overflow上看到了关于如何将简单哈希转换为CSV格式的几个例子,但是我找不到任何使用更大数据集来做这个事情的复杂例子。
我想使用哈希键("pluginID"
,"ip"
,"pluginName"
等)作为CSV标头和哈希值("11112"
,{{ 1}},"100.100.100.100"
等)用于CSV行内容。
请注意,"Name for plugin here"
键本身就是一个哈希值,为此,我只想使用名称,而不是ID或描述。
非常感谢任何帮助。我按照Ruby CSV标准库说明使用了一些代码示例,但我甚至没有接近。
"repository"
答案 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)
这很简单。基本上有五个步骤:
"results"
数组†的第一个哈希中获取密钥名称,并将其作为标题写入CSV文件。迭代"results"
数组和每个哈希:
"repository"
哈希值替换为"name"
值。代码看起来像这样:
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中所需的所有密钥。如果不是这种情况,您需要:
明确指定标题,例如:
headers = %w[ pluginId ip pluginName ... ]
遍历所有哈希并构建一个所有键的列表:
headers = results.reduce([]) {|all_keys, result| all_keys | result.keys }