【问题标题】:Append new lines to a csv from json.parse从 json.parse 将新行附加到 csv
【发布时间】:2015-06-30 08:13:32
【问题描述】:

系统管理员(厨师)比 ruby​​ 人多,所以这可能需要五分钟的时间。 我正在执行一项任务,我编写了一个 ruby​​ 脚本,该脚本从多个文件中提取 json 数据,对其进行解析,并将所需的字段写入单个 .csv 文件。基本上是提取有关 aws 帐户的元数据并将其放入会计友好的格式中。

从另一个 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 文件,然后将每个文件元数据附加到新行?这看起来像是编写正确循环的简单案例,但我无法弄清楚。

【问题讨论】:

标签: ruby json parsing csv


【解决方案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,它将附加到已经存在的内容。

【讨论】:

  • 钉在头上。完美解决问题。
  • @jcarapet 很高兴我能帮上忙!
【解决方案2】:

你需要以追加模式打开文件,使用

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'

【讨论】:

    猜你喜欢
    • 2019-03-26
    • 1970-01-01
    • 2016-04-08
    • 2019-10-19
    • 1970-01-01
    • 2018-05-24
    • 2015-08-02
    • 1970-01-01
    • 2020-02-17
    相关资源
    最近更新 更多