2016-01-30 49 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"}]