2016-01-30 45 views
1

我有一個文本文件(下面)是從一個腳本不能改變產生的。我從服務器獲取的文件,然後我想用Ruby腳本把這個JSON的「串」成真正的JSON ......製作的文件的json的文件散列成真正的json與紅寶石

例子:

{"Key": "value", "Key2": "value2", "Key3": "value3"} 
{"Key": "value", "Key2": "value2", "Key3": "value3"} 
{"Key": "value", "Key2": "value2", "Key3": "value3"} 

注缺乏正確的json格式和缺少任何逗號...在此先感謝您的幫助!

+0

是不是每行嚴格一個對象? –

+0

是的,每行只有一個對象。 – gregwinn

回答

1

假設對象是每行一個條目,你可以做到以下幾點:

require 'json' 

objects = $stdin.each_line.map { |line| JSON.parse(line) } 
puts JSON.pretty_generate(objects) 

然後只需運行ruby clean.rb <log.txt> output.json。對於緊湊型JSON,請使用JSON.dump而不是JSON.pretty_generate

如果你想保存,避免解析和生成JSON一點時間和內存,你可以做到以下幾點:

prev = nil 
print '[' 
$stdin.each_line do |line| 
    print prev.strip + "," if prev 
    prev = line 
end 
print prev.strip + ']' 

類似的方法是使用sed追加逗號將各個線和環繞所有與括號。

+1

將'each_line'指定爲'read.lines',以避免一次將整個文件讀入內存。 –

+0

@Jordan:絕對,謝謝,更新了我的答案。 –

1

您還可以使用eval將字符串轉換爲紅寶石哈希。下面是一個簡單的Ruby的解決方案,不需要I/O重定向:

require 'json' 

array_of_hashes = [] 
File.open('hash.txt').each_line do |line| 
    array_of_hashes << eval(line) 
end 


puts array_of_hashes.to_json 

返回:

[{"Key":"value","Key2":"value2","Key3":"value3"},{"Key":"value","Key2":"value2","Key3":"value3"},{"Key":"value","Key2":"value2","Key3":"value3"}]