2012-05-18 24 views
1

我需要導入一個大的CSV文件,細分爲小塊,每隔X小時輸入一次。從小塊輸入記錄CSV(紅寶石在軌道上)

我做了以下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記錄每一天:

這意味着我需要跟蹤導入的最後一行,並從該行開始+ = 1,下一次讓耙子任務運行,我該如何實現?

在此先感謝!

回答

0

將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

+0

是否可以在foreach循環中寫入CSV,以便在創建記錄後設置處理後的字段? – Laurens

+0

不知道您是否可以使用正常的CSV寶石更新字段,適合新的問題,我認爲使用fastercsv寶石可以。 請參閱http://stackoverflow.com/questions/3561278/parse-a-csv-update-a-field-then-save的方式 – peter

+0

彼得,請你給我一個例子如何添加一個字段處理到CSV被讀取後?我在使用foreach循環寫入CSV時遇到困難。提前致謝。 – Laurens

0

你可能想要做這樣的事情了分塊的CSV解析,然後排隊與Resque訪問數據庫的工作,以適當的方式安排它們,所以它們運行節流:

https://gist.github.com/3101950