获取json数据并将其转换为CSV文件

时间:2014-09-28 20:12:20

标签: ruby json csv

好的......这里对Ruby很新,但到目前为止还很喜欢它。我的问题是我无法将数据输入CSV文件。

#!/usr/bin/env ruby
require 'date'
require_relative 'amf'
require 'json'
require 'csv'

amf = Amf.new
#This makes it go out 3 days
apps = amf.post( 'Appointments.getBetweenDates',
             { 'startDate' => Date.today, 'endDate' => Date.today + 4 }
)

apps.each do |app|
cor_md_params = { 'appId' => app['appID'], 'relId' => 7 }
cor_md = amf.post( 'Clinicians.getByAppIdAndRelId', cor_md_params ).first


#this is where it breaks ----->
CSV.open("ile.csv", "wb") do |csv|
csv << ["column1", "column2", "etc.", "etc.."]

csv << ([

# if added puts ([ I can display the info and then make a csv...
  app['patFirstName'],
  app['patMiddleName'],
  app['patLastName'],
  app['patBirthdate'],
  app['patHin'],
  app['patPhone'],
  app['patCellPhone'],
  app['patBusinessPhone'],
  app['appTime'],
  app['appID'],
  app['patPostalCode'],
  app['patProvince'],
  app['locName'],

  # note that this is not exactly accurate for follow-ups,
  # where you have to replace the "1" with the actual value
  # in weeks, days, months, etc
  #app[ 'bookName' ], => not sure this is needed

  cor_md['id'],
  cor_md['providerCode'],
  cor_md['firstName'],
  cor_md['lastName']


].join(', '))

end
end

现在,如果我删除了制作ile.cvs文件的尝试并只输出了一个put,则显示所有数据。但我不想进入终端并创建一个csv文件...我宁愿只运行.rb程序并创建它。此外,希望我也能正确制作列...

我想到我可以在输出之上添加另一个put。 或者,更好的是,在输出之前在数组中插入一行......

真的不确定这里的最佳做法和标准。

这就是我所做的和尝试过的。我怎样才能将它干净地输出到CSV文件,因为我的尝试不起作用

此外,为了澄清它中断的位置,它确实添加了列名而不是解析的JSON信息。我也可以完全以错误的方式或不可能的方式做到这一点。我只是不知道。

1 个答案:

答案 0 :(得分:1)

你得到什么样的错误?是这个:

<<': undefined method map'for“something”:String(NoMethodError)

我想,你应该删除.join(',') &lt;&lt;&lt; CSV的方法接受数组,但不接受字符串

http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html#method-i-3C-3C

所以而不是:

  cor_md['lastName']
].join(', '))

,而:

  cor_md['lastName']
])
  1. 循环问题(为什么只写一行数据)
  2. 在循环体中,您始终重新打开文件,并始终重写之前添加的内容。你想做什么,可能就是这样:

    CSV.open("ile3.csv", "wb") do |csv|
      csv << ["column1", "column2", "etc.", "etc.."]
      apps.each do |app|
        cor_md_params = { 'appId' => app['appID'], 'relId' => 7 }
        cor_md = amf.post( 'Clinicians.getByAppIdAndRelId', cor_md_params ).first
        #csv << your long array
      end
    end