2015-04-22 88 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'