【问题标题】:Taking json data and converting it to a CSV file获取 json 数据并将其转换为 CSV 文件
【发布时间】:2014-11-23 05:05:49
【问题描述】:

好的...这里对 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 文件的尝试并使用 puts 输出它,所有数据都会显示。但我不想进入终端并创建一个 csv 文件......我宁愿只运行 .rb 程序并创建它。另外,希望我也能正确地制作列......

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

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

这是我已经做过和尝试过的。由于我的尝试不起作用,如何让它干净地输出到 CSV 文件

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

【问题讨论】:

    标签: ruby json csv


    【解决方案1】:

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

    &lt;&lt;': undefined methodmap' 表示“某事”:字符串 (NoMethodError)

    我认为,您应该删除 .join(', ') 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. 循环的问题(为什么它只写入 1 行数据)

    在循环体中,您始终会重新打开文件,并始终重写您之前添加的内容。你想做的,大概是这样的:

    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
    

    【讨论】:

    • 啊!这行得通,但现在的问题是我只得到 1 行数据,所以看起来我需要做更多的工作才能获得所有数据输出......可能的循环......不确定......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    相关资源
    最近更新 更多