将 JSON 纪元转换为 Ruby 中的日期时间以转换为 CSV 文件

Convert JSON Epoch to DateTime in Ruby for Conversion to CSV File

你好 Stack Overflow 朋友,

我们使用电子邮件指标 API returns 在 JSON 中请求的数据。我想要做的是将 JSON 转换为 Ruby 中的 CSV 文件(我已经能够使用 json-converter gem 成功完成)。但是,显然 Epoch 中的 JSON returns date/time 字段对大多数人来说是无用的。因此,我想弄清楚两件事:

1) 如何适当地将 Epoch 转换为更易于阅读的 CSV 文件date/time,以及

2) 在我的 Ruby 代码中的什么地方我需要尝试这样做 - 在 JSON 到 CSV 转换之前或之后?

目前的示例代码如下:

JSON响应

{
  "data": [
    {
      "id": 571823,
      "subCommunityId": 2,
      "emailName": "Email Name",
      "fromName": "John Doe",
      "fromAddress": "john@doe.com",
      "subjectLine": "This is my subject",
      "preHeader": "",
      "categoryName": "General Communication",
      "sentCount": 15678,
      "scheduledDateTimestamp": 1504889858000,
      "actualSendTimestamp": 1504889858000,
      "dateAdded": 1504889859576
    }
  ],
  "startAt": 0,
  "maxResults": 1000,
  "total": 1
}

Ruby 脚本 - JSON 到 CSV

require 'json_converter'
converter = JsonConverter.new
json = File.read("emailresponse.json")
converter.write_to_csv(json, "emailreporting.csv")

欢迎提出任何关于如何最好地做到这一点的想法。

Ruby 的内置 DateDateTimeTime 类 可以相当轻松地处理这些类型的转换。这里有几个选项:

Time.at(1504889858000/1000).to_datetime.to_s
=> "2017-09-08 12:57:38 -0400"

...

require 'date'
DateTime.strptime((1504889858000/1000).to_s, '%s').to_s
=> "2017-09-08T16:57:38+00:00"

至于如何处理你程序中的逻辑。一种方法是将文件中的 JSON 提取到 ruby 哈希中。然后更改与值是时间戳的任何键关联的值。然后将哈希传递给您的转换器库进行写入。像这样的事情可能会做到:

require 'json'

f = File.read('emailresponse.json')
hash_of_stuff = JSON.parse(f)
hash_of_stuff['scheduledDateTimestamp'] = Time.at(hash_of_stuff['scheduledDateTimestamp']/1000).to_datetime.to_s
...
converter.write_to_csv(hash_of_stuff, 'endresult.csv')

实际上,Ruby 已经可以构建 CSV。

require 'json'
require 'csv'

json = '{
  "data": [
    {
      "id": 571823,
      "subCommunityId": 2,
      "emailName": "Email Name",
      "fromName": "John Doe",
      "fromAddress": "john@doe.com",
      "subjectLine": "This is my subject",
      "preHeader": "",
      "categoryName": "General Communication",
      "sentCount": 15678,
      "scheduledDateTimestamp": 1504889858000,
      "actualSendTimestamp": 1504889858000,
      "dateAdded": 1504889859576
    }
  ],
  "startAt": 0,
  "maxResults": 1000,
  "total": 1
}'
hash = JSON.parse(json)

CSV.open('emailreporting.csv', 'w') do |csv| 
  # write headers row
  csv << hash['data'].first.keys 

  # write data rows
  hash['data'].each do |data| 
    data['scheduledDateTimestamp'] = Time.at(data['scheduledDateTimestamp'] / 1000)
    data['actualSendTimestamp'] = Time.at(data['actualSendTimestamp'] / 1000) 
    data['dateAdded'] = Time.at(data['dateAdded'] / 1000) 
    csv << data.values  
  end
end

手动构建 CSV 有一些优势:

  1. 使用 Ruby 的标准库而不是一些鲜为人知的 gem
  2. 在构建 csv 期间有更多控制