2015-04-22 54 views
0

更多的系统管理员(厨师)比红宝石的家伙,所以这可能是一个五分钟的修复。 我正在写一个ruby脚本,从多个文件中提取json数据,解析它,并将所需的字段写入一个.csv文件。基本上拉动aws帐户的元数据并将其设置为会计友好格式。从json.parse向csv追加新行

从另一个stackoverflow获得了很多关于如何解决单个文件json.parse help的问题的帮助。

我的问题是,我试图从数组中的多个JSON文件中提取相同的数据。我可以通过下面的代码来遍历每个文件。

require 'csv' 
require "json" 

delim_file = CSV.open("delimited_test.csv", "w") 
aws_account_list = %w(example example2) 
aws_account_list.each do |account| 
json_file = File.read(account.to_s + "_aws.json") 
parsed_json = JSON.parse(json_file) 

delim_file = CSV.open("delimited_test.csv", "w") 
# This next line could be a problem if you ran this code multiple times 
delim_file << ["EbsOptimized", "PrivateDnsName", "KeyName",    "AvailabilityZone", "OwnerId"] 
parsed_json['Reservations'].each do |inner_json| 
inner_json['Instances'].each do |instance_json| 
    delim_file << [[instance_json['EbsOptimized'].to_s, instance_json['PrivateDnsName'], instance_json['KeyName'], instance_json['Placement']['AvailabilityZone'], inner_json['OwnerId']],[]] 
end 
delim_file.close 
end 

end 

但是,每当我这样做时,它会覆盖每次到.csv文件中的同一行。我已经尝试在数组的末尾添加一个\ n字符串,将该数组转换为带有哈希的字符串并执行\ n,但所做的只是将一行添加到它覆盖的同一行。

我该如何去编写它读取每个json文件,然后将每个文件元数据附加到新行?这看起来像是编写正确循环的简单例子,但我无法弄清楚。

+0

http://stackoverflow.com/q/7085595/438992例如,在追加模式打开,不写模式。 –

回答

1

你宣布你的文件是这样的:

delim_file = CSV.open("delimited_test.csv", "w") 

要解决你的问题,你所要做的就是改变"w""a"

delim_file = CSV.open("delimited_test.csv", "a") 

对的说明,请参阅该文档为IO#new可用的文件模式。简而言之,w在文件名中创建一个空文件,覆盖其他任何人,并写入该文件。 a只在文件不存在时创建文件,否则附加。因为您目前拥有w,所以每次运行脚本时都会覆盖它。与a,它会追加到已有的东西。

+0

钉在头上。修正事情完美。 – jcarapet

+0

@jcarapet很高兴能帮到你! –

0

您需要追加方式打开文件,使用

delim_file = CSV.open("delimited_test.csv", "a") 

'a' Write-only, starts at end of file if file exists, otherwise creates a new file for writing.

'a+' Read-write, starts at end of file if file exists, otherwise creates a new file for reading and writing'