2013-08-08 21 views
7

mam pewne wyniki:analizowania Ruby tablicy do JSON

puts result 

które wyglądają jak tego wyjścia:

Allowed 
20863963 
1554906 
Denied 
3607325 
0 
Quarantined 
156240 
0 

Debug

p results 

wyjście

[["Allowed", 20863963, 1554906], ["Denied", 3607325, 0], ["Quarantined", 156194, 0]] 

Nagłówki są:

status,hits,page_views 

muszę przekonwertować to do JSON. Jeśli wyniki byłyby w standardowym formacie csv, byłoby to proste, ale jak by się do niego zbliżyć, gdyby format wyników wyglądał jak powyżej?

Oczekiwany wyświetli coś podobnego do tego:

[{"status":"Allowed","hits":"20863963","page_views":"1554906"},{"status":"Denied","hits":"3607325","page_views":"0"},{"status":"Quarantined","hits":"156240","page_views":"0"}] 

Rozwiązanie

a = result.map{|s| {status: s[0], hits: s[1].to_i, page_views: s[2].to_i} } 
puts a.to_json 
+2

Jakiego rodzaju obiektem jest 'result'? Tablica? Czy możesz opublikować wyniki, które spodziewasz się uzyskać? – toro2k

+0

dodano do oryginalnego wpisu. thx – pablo808

+0

Jaki kod napisałeś, aby rozwiązać ten problem? To naprawdę łatwa rzecz. –

Odpowiedz

4
output = "Allowed 
20863963 
1554906 
Denied 
3607325 
0 
Quarantined 
156240 
0" 

a = output.split("\n").each_slice(3).map{|s| {status: s[0], hits: s[1].to_i, page_views: s[2].to_i} } # => [{:status=>"Allowed", :hits=>20863963, :page_views=>1554906}, {:status=>"Denied", :hits=>3607325, :page_views=>0}, {:status=>"Quarantined", :hits=>156240, :page_views=>0}] 
a.to_json # => => "[{\"status\":\"Allowed\",\"hits\":20863963,\"page_views\":1554906},{\"status\":\"Denied\",\"hits\":3607325,\"page_views\":0},{\"status\":\"Quarantined\",\"hits\":156240,\"page_views\":0}]" 
+0

Musiałem zaktualizować dane wyjściowe i rozwiązać je, patrząc na twoją odpowiedź. – pablo808

2

przypisać swoje "nagłówki" do attr_accessor a następnie powiedzieć JSON do analizowania tego symbolu. Oto przykład:

class Document 
    attr_accessor :content 

    def content 
    metadata[:content] || metadata['content'] 
    end 

    def self.parse_contents 
    txt = File.read(path, {mode: 'r:bom|utf-8'}) 

    page = Document.new 
    page.metadata = JSON.parse(txt) 
    page.content = page.metadata['content'] 

    return page 
    end 
end 

Mam nadzieję, że pomoże!

10

Spójrz na metodę to_json.

require 'json' 
# => true 
h = {a: 1, b: 2,c: 3} 
# => {a: 1, b: 2,c: 3} 
h.to_json 
# => "{\"a\":1,\"b\":2,\"c\":3}" 
Powiązane problemy