2016-07-19 16 views
-2

ich eine Datei funktioniert:Wie ein „jeder“ Schleife zu beheben, die nicht

{ 
    "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\"}" 
    } 
    } 
} 

Ich möchte eine Hash wie folgt aus:

g = {"aaa_test01.myname.com"=> "aaa-test01", "osilek.myname.com" => "osilek"} 

Die Schlüssel in diesem Hash muss sind die gleichen wie die Schlüssel in Ergebnissen, Werte müssen mit den Werten von Hostname aus den Ergebnissen übereinstimmen.

Ich habe diesen Code:

#!/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 

In

new_h = h.inject({}) {|new_h, (k,v)| new_h.merge(key => hash.values)} 

sieht alles ok, und ich bekomme

new_h = {{"networking"=>["aaa-test01"]}, {"networking"=>["osilek"]}} 

Aber im nächsten Schritt an Stelle des g Hash ich die results Hash vor dem Eintritt in die Schleife. Die Schleife funktioniert nicht gut und ich weiß nicht warum.

+0

Ihre 'new_h = = h.inject ({}) ...' ist nicht verwendete Variable. – Aleksey

+0

Ok, so wie es zu beheben? – mila002

+2

Ich arbeite gerade daran. Bist du sicher, dass es "osilek.myname.com" => "osilek" "nicht" "osilek" => "osilek.myname.com" '? Wegen '' aaa_test01.myname.com "=>" aaa-test01 "' – Aleksey

Antwort

0

Ich weiß nicht, wo das Problem in Ihrem Code ist, aber man kann es wie folgt tun:

any.txt:

{ 
    "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\"}"}} 
} 

process.rb:

require 'json' 

json = JSON.load(File.new("any.txt")) 

export = json['results'].each_with_object({}) do |(k, h), exp| 
    next unless h['networking'] 
    network = JSON.parse(h['networking'].gsub('=>', ':')) 
    exp[k] = network['hostname'] unless network['hostname'].to_s.strip.empty? 
end 

p export 
# {"aaa-test01.myname.com"=>"aaa-test01", "osilek"=>"osilek.myname.com"} 
1

Ein anderer Weg:

data['results'].inject({}) do |hash, (k, v)| 
    fallback = JSON.parse(v['networking'].gsub('=>', ':'))['hostname'] 
    hash.merge("#{k}": v['hostname'] || fallback) 
end 

# {:"aaa-test01.myname.com"=>"aaa-test01", :osilek=>"osilek.myname.com"}