从CSV导入CSV小块记录(ruby on rails)

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

提前致谢!

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

如果要将CSV保持为整体,请在CSV中添加“pocessed”字段,如果读取则填充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

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

https://gist.github.com/3101950