【问题标题】:Convert JSON Epoch to DateTime in Ruby for Conversion to CSV File在 Ruby 中将 JSON Epoch 转换为 DateTime 以转换为 CSV 文件
【发布时间】:2018-04-10 07:17:10
【问题描述】:

你好 Stack Overflow 朋友,

我们使用以 JSON 格式返回请求数据的电子邮件指标 API。我正在尝试做的是将 JSON 转换为 Ruby 中的 CSV 文件(我已经能够使用json-converter gem 成功地做到这一点)。但是,显然 JSON 在 Epoch 中返回日期/时间字段,这对大多数人来说是无用的。因此,我试图弄清楚两件事:

1) 如何将 Epoch 适当地转换为 CSV 文件更易读的日期/时间,以及

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")

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

【问题讨论】:

    标签: json ruby csv datetime epoch


    【解决方案1】:

    实际上,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 期间进行更多控制

    【讨论】:

    • 完美!非常感谢!
    【解决方案2】:

    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')
    

    【讨论】:

      猜你喜欢
      • 2014-06-04
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      相关资源
      最近更新 更多