【问题标题】:Rails Seed DB From CSV - Trouble With Date Format来自CSV的Rails Seed DB - 日期格式问题
【发布时间】:2011-11-18 01:51:48
【问题描述】:

(这是我关于 ruby​​/rails 新手和一般编程的必要条件;也是第一个 SO 问题)

我有一个 rake 任务从 CSV 中为我的 MySQL 数据库播种-

...
    CSV.read(uri).each do |row|
      Incident.create(
        :building_address => row[9],
        :agency => row[3],
        :complaint_type => row[6],
        :descriptor => row[5],
        :created => row[1],
        :closed => row[2],
        )
end

:created:closed 被定义为日期字段(并且也与 rails created_at 和 updated_at 字段分开/无关),但我假设 CSV 文件仅识别字符串。

当我运行此任务时,日期和月份会切换。所以 CSV 中的 1/12/2010 12:00:00 AM(对于 CSV 和我在美国意味着 1 月 12 日)最终被解析为 2010-12-1,并且 12 之后的任何一天都返回 null,所以 1/20/2010 12:00:00 AM 导致在我的数据库。

我加了

date:
    formats:
        default: "%m/%d/%Y"

到我的 en.yml,但这似乎只影响日期的显示,对通过我的 rake 任务创建对象没有影响。在搜索了 SO 和其他资源后,我尝试了

:created => row[1].strftime,

:created => row[1].strptime,

但得到了undefined method strptime/strftime for "Created Date":String(创建日期是 CSV 中列的名称)。

所以我也试过了

:created => row[1].to_date

将 CSV 中的(可能)“日期”字符串更改为日期,但收到错误 undefined method '<' for nil:NilClass

更改 CSV 中的日期字段似乎不太可行,因为有超过 100 万条记录。

如何编辑此 rake 任务以从该 CSV 正确地为我的数据库播种?还是应该将 :created 从日期更改为字符串并在应用程序逻辑中对其进行操作?

【问题讨论】:

    标签: mysql ruby-on-rails csv rake


    【解决方案1】:

    您可以尝试使用DateTime.strptime 将您的字符串转换为 DateTime 实例:

    :created => DateTime.strptime(row[1], '%m/%d/%Y %H:%M:%S %p'),
    :closed  => DateTime.strptime(row[2], '%m/%d/%Y %H:%M:%S %p')
    

    strptime 类方法可以让您准确指定您正在使用的格式,这样任何软件都不必猜测。我建议您将来坚持使用 ISO 8601 日期和时间格式供内部使用,将模棱两可的格式留给人类使用。

    【讨论】:

    • 昨晚尝试了这个和一些变化,但不断收到invalid date 错误。我想可能是因为:created:closed 是Date 类而不是DateTime,但改变没有帮助。今晚将继续尝试,同时阅读更多关于您链接到的 ruby​​ 文档。
    • @sbauch::created:closed 列是什么类型?他们是datedatetime 还是timestamp?如果它们是日期,请尝试 Date.strptime(row[1], '%m/%d/%Y')Date.strptime(row[2], '%m/%d/%Y') 忽略一天中的时间部分。
    • 我都试过了。现在我的两列都是date,并且能够在我的控制台中使用Date.strptime('12/15/2010 12:00 AM', '%m/%d/%Y')(直接从我的csv中复制了那个日期)。但仍然在 rake 任务中收到 invalid date 错误。
    • @sbauch:DateIncident 是哪个在抱怨“无效日期”?
    • 看起来我的 CSV 标头搞砸了。谢谢您的帮助!编辑-虽然我想我想通了,但怎么知道?我收到了invalid date /Users/Sam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/date.rb:1022:in new_by_frags'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多