2012-05-18 4 views
1

Мне нужно импортировать большой CSV-файл, разбитый на мелкие куски, которые будут импортироваться каждые X часов.Импорт записей из CSV в небольших кусках (ruby on rails)

Я сделал следующее рейк задачу

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 в целом, добавьте поле «pocessed» в CSV и заполните его 1, если прочитаете, в следующий раз отфильтруйте их.

EDIT: это не тестируется и конечно может быть лучше, но только, чтобы показать, что я имею в виду

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

Можно ли записать в CSV в цикле foreach, чтобы я мог настроить обработанное поле после создания записи? – Laurens

+0

не знаю, можете ли вы обновить поле с помощью обычного CSV-жемчужины, что хорошо для нового вопроса, я думаю, что это возможно с драгоценным камнем fastcsv. См. Http://stackoverflow.com/questions/3561278/parse-a-csv-update-a-field-then-save для пути – peter

+0

Питер, не могли бы вы дать мне пример того, как добавить поле, обработанное на CSV после его чтения? У меня возникают трудности с написанием CSV в цикле foreach. Заранее спасибо. – Laurens

0

вас мог бы хотеть сделать что-то подобное для фрагментированного CSV разбора, а затем епдиеие заданий, которые поражают базу данных с Resque и планировать их соответствующим образом, поэтому они бегут задушили:

https://gist.github.com/3101950

Смежные вопросы