1

X時間ごとにインポートされる小さなチャンクに分割された大きなCSVファイルをインポートする必要があります。

次のレーキタスクを作成しました

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 に答える