【发布时间】:2016-11-22 14:14:51
【问题描述】:
我有一个文件:
{
"total": 0,
"subtotal": 807,
"page": 1,
"per_page": 1000,
"search": "hostname",
"sort": {
"by": null,
"order": null
},
"results": {
"aaa-test01.myname.com":{
"hostname":"aaa-test01",
"networking":"{\"hostname\"=>\"aaa-test01\", \"mtu\"=>1500, \"netmask\"=>\"255.255.255.224\", \"primary\"=>\"eth0\"}"
},
"osilek":{
"networking":"{\"hostname\"=>\"osilek.myname.com\", \"mtu\"=>1500, \"netmask\"=>\"255.255.255.128\", \"netmask6\"=>\"ffff:ffff:ffff:ffff::\",\"primary\"=>\"eth1\"}"
}
}
}
我想要这样的哈希:
g = {"aaa_test01.myname.com"=> "aaa-test01", "osilek.myname.com" => "osilek"}
此哈希中的键必须与结果中的键相同,值必须与结果中的主机名值相同。
我有这个代码:
#!/usr/bin/ruby
require 'rubygems'
require 'json'
data = JSON.load File.new("any.txt")
results = data["results"]
results.each do |key, hash|
hash.select! {|k,v| k == "networking"}
end
results.each do |key, h|
h.each do |key, hash|
#puts hash.select! {|k,v| k == "hostname"}
hash = JSON.parse hash.gsub('=>', ':')
hash.select! {|k,v| k == "hostname"}
new_h = h.inject({}) {|new_h, (k,v)| new_h.merge(key => hash.values)}
puts g = results.inject({}) {|g, (key, new_h)| g.merge(key => new_h.values)}
end
end
在
new_h = h.inject({}) {|new_h, (k,v)| new_h.merge(key => hash.values)}
一切正常,我明白了
new_h = {{"networking"=>["aaa-test01"]}, {"networking"=>["osilek"]}}
但在下一步中,我在进入循环之前得到了results 散列而不是g 散列。循环不好用,我也不知道为什么。
【问题讨论】:
-
您的
new_h = = h.inject({}) ...是未使用的变量。 -
好的,那怎么解决呢?
-
我只是在工作。你确定应该是
"osilek.myname.com" => "osilek"而不是"osilek" => "osilek.myname.com"?因为"aaa_test01.myname.com"=> "aaa-test01" -
如果您的意思是 g 哈希,实际上并不重要。我想用这些变量来更新服务器上的数据,不管是先用值还是先用键。
-
我可以向您保证,
each本身肯定可以工作。是你的代码有一两个错误。