2012-05-18 2 views
0

Мне нужно иметь возможность сравнивать два столбца каждой строки в CSV с моей собственной базой данных.Импорт записей из CSV и запись в то же время в тот же CSV?

Например, строка выглядит следующим образом:

Headers => "Zipcode", "HouseNumber" 
Row 1 => "5435 ZX", "43" 

Сначала мне нужно найти компанию в своей собственной базе данных, основанный на почтовый индекс и номер дома, и, если это возвращает истину, то мне нужно импортировать остальные столбцы в этой строке. Я знаю, как это решить.

Но мне также нужно иметь возможность отслеживать импортированные строки, потому что мне нужно разделить полные записи в маленьких кусках, поэтому мне нужно добавить дополнительное поле в каждую строку после импорта.

Резюмируя:

Как я могу добавить дополнительное поле («импортный») в каждой строке один раз импортируемого в следующем цикле:

CSV.foreach('reviews.csv', :headers => true) do |row| 
    Review.create(row.to_hash) 
end 
+0

Перечитывая вопрос, мне кажется, что линия «Мне нужно разделить полные записи в маленьких кусках» - зачем вам это нужно? Можете ли вы дать больше контекста? –

ответ

0

Кажется, что проще всего сделать будет поддерживать «импортный» состояние в отдельной хэш, например, так:

imported = {} 
CSV.read('reviews.csv').each_with_index do |row, line| 
    if <your condition> && !imported[line] 
    # create model 
    imported[line] = true 
    end 
end 

Тогда просто держать этот хэш вокруг, пока вы не должны прочитать следующий блок, и повторного запуска. Бит && !imported[line] не позволит прочитать строку дважды.

Если это не то, что вы ищете, вам нужно немного уточнить свой вопрос. :-)

1

Этот фрагмент кода будет создавать Review если вы можете найдите Company. Вы должны будете очистить его до соответствия его правильным именам атрибутов для таблицы companies.

CSV.foreach('reviews.csv', :headers => true) do |row| 
    Review.create(row.to_hash) if Company.where("Zipcode = ? and HouseNumber = ?", 
     row.Zipcode, row.HouseNumber) 
end 

Чтобы добавить дополнительный столбец, к следующему:

CSV.foreach('reviews.csv', :headers => true) do |row| 
    if company = Company.where("Zipcode = ? and HouseNumber = ?", 
     row.Zipcode, row.HouseNumber) 
    row[:imported] = true 
    Review.create(row.to_hash) 
end 

Это предполагает, что imported столбец существует в таблице.

Думаю, нам может понадобиться дополнительная информация, чтобы дать вам более полный ответ, но идеи здесь должны помочь вам.

+0

Спасибо за быстрый ответ, но строка [: imported] = true (или строка) не работает. Я использую это в задаче rake, но «импортированные» поля в файле не меняются. – Laurens

+0

Вот почему я говорил, что нам нужна дополнительная информация. Можете ли вы опубликовать этот код модели? –

+0

Это не код модели, который ломается ... Даже это не удается: CSV.foreach ('reviews.csv',: headers => true) do | row | строка [: импортировано] = "true" end – Laurens

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