【问题标题】:Import records from CSV in small chunks (ruby on rails)以小块从 CSV 导入记录(ruby on rails)
【发布时间】:2012-05-25 21:34:32
【问题描述】:

我需要导入一个大的 CSV 文件,分解成小块,每 X 小时导入一次。

我做了以下 rake 任务

task :import_reviews => :environment do
 require 'csv'
 CSV.foreach('reviews.csv', :headers => true) do |row|
  Review.create(row.to_hash)
 end
end

使用 heroku 调度程序我可以让这个任务每天运行,但我想把它分成几个块,例如每天 100 条记录:

这意味着我需要跟踪导入的最后一行,并在下一次让 rake 任务运行时从该行开始 += 1,我该如何实现?

提前致谢!

【问题讨论】:

    标签: ruby-on-rails ruby csv heroku import


    【解决方案1】:

    您可能希望对分块的 CSV 解析执行类似的操作,然后将使用 Resque 访问数据库的作业排入队列并以适当的方式安排它们,因此它们运行受限:

    https://gist.github.com/3101950

    【讨论】:

      【解决方案2】:

      将 CSV 的其余部分读入一个数组,然后在 CSV.foreach 循环之外写入同一个 CSV 文件,这样每次都会变小。我想我不必在代码中给出这个,但如果有必要评论我,我会这样做。

      如果您想保留整个 CSV,请在 CSV 中添加一个“已处理”字段,如果读取,则用 1 填充,下次过滤掉。

      编辑:这未经测试,肯定会更好,但只是为了说明我的意思

      require 'csv'
      index = 1
      csv_out = CSV::Writer.generate(File.open('new.csv', 'wb'))
      CSV.foreach('reviews.csv', :headers => true) do |row|
        if index < 101
          Review.create(row.to_hash)
        else
          csv_out << row
        end
        index += 1
      end
      csv_out.close
      

      之后,转储reviews.csv 并将new.csv 重命名为reviews.csv

      【讨论】:

      • 是否可以在foreach循环中写入CSV,这样我可以在创建记录后设置处理的字段?
      • 不知道您是否可以使用普通的 CSV gem 更新字段,这对新问题有好处,我认为使用 fastcsv gem 可以。方法见stackoverflow.com/questions/3561278/…
      • 彼得,你能给我一个例子,如何在读取后将处理的字段添加到 CSV 中吗?我在 foreach 循环中写入 CSV 时遇到困难。提前致谢。
      猜你喜欢
      • 2012-02-14
      • 2016-03-24
      • 2011-05-23
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      相关资源
      最近更新 更多