将 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 的内置 Date
、DateTime
和 Time
类 可以相当轻松地处理这些类型的转换。这里有几个选项:
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 有一些优势:
- 使用 Ruby 的标准库而不是一些鲜为人知的 gem
- 在构建 csv 期间有更多控制
你好 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 的内置 Date
、DateTime
和 Time
类 可以相当轻松地处理这些类型的转换。这里有几个选项:
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 有一些优势:
- 使用 Ruby 的标准库而不是一些鲜为人知的 gem
- 在构建 csv 期间有更多控制