1

我需要导入一个大的 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,我该如何实现呢?

提前致谢!

4

2 回答 2

0

将 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

于 2012-05-18T10:13:50.060 回答
0

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

https://gist.github.com/3101950

于 2012-07-15T22:51:57.587 回答