2010-09-10 2 views
0

Я пытаюсь использовать модуль csv Ruby для импорта записей, содержащихся в файле csv, в мою локальную таблицу в приложении Ruby on Rails 3.Ошибка импорта файла csv с ruby ​​CSV Module

Таблица была создана путем создания модели Movie.

Вот что я выполнение в консоли:

require 'csv' 
CSV.foreach('public/uploads/VideoTitles2.csv') do |row| 
    record = Movie.new(
     :media_format => row[0], 
     :title   => row[1], 
     :copies_at_home => row[2], 
     :order   => row[3] 
    ) 
    record.save 
end 

Ряды матча CSV-файл (в типе данных) столбцы они пропускают в. Вот сокращенная версия файла CSV (VideoTitles2.csv) Я пытающийся импорт:

"DVD","LEAP OF FAITH",1,1 
"DVD","COCOON",1,2 
"DVD","TITANIC",1,3 

, где каждая запись отделена \ п я считаю. Этот файл csv был экспортирован из Access, а его исходное расширение было .txt. Я вручную изменил его на .csv для импорта.

Проблема заключается в том, что после выполнения вышеуказанных строк в рельсах консоли, я получаю следующий результат:

=> nil 

импорт, кажется, не произойдет. Если у кого-то есть идея, как я могу это исправить, я бы очень признателен.

ответ

1

Хорошо было две вещи, которые я не так:

  1. В экспортированный файл csv не должен содержать котировок вокруг строк - я просто удалил их.

  2. Благодаря tokland, record.save! (в отличие от записи. Я делаю это) - ошибки проверки были, препятствуя созданию записей.

Так заключить, можно было бы просто создать следующую функцию после создания модели/таблицы Movie:

class Movie < ActiveRecord::Base 
    attr_accessible :media_format, :title, :copies_at_home, :order 
    require 'csv' 

    def self.import_movies() 
    CSV.foreach('public/uploads/movies.csv') do |row| 
     record = Movie.new(
      :media_format => row[0], 
      :title   => row[1], 
      :copies_at_home => row[2], 
      :order   => row[3] 
     ) 
     record.save! 
    end 
    end 
end 

Где фильмы.CSV выглядит следующим образом:

Blu-ray, Movie 1, 1, 1 
DVD, Movie 2, 1, 2 
Blu-ray, Movie 3, 1, 3 

затем вызвать эту функцию в консоли, как например:

Movie.import_movies() 

и, как и ожидалось, все, что будет возвращен в консоли будет:

=> nil 

Проверьте свой индексный указатель (если вы его создали), и вы увидите, что записи были успешно импортированы в таблицу фильмов.

+0

без контроля повторных фильмов? также, это хороший этикет для функции, чтобы вернуть что-то значимое. Может быть, массив недавно созданных фильмов? может быть, просто номер? примечание тоже это новый + save! = создать! – tokland

+0

Да, очень верно; Я использовал его как единую вещь – anxiety

1

Я не вижу проблемы. Этот фрагмент кода возвращает nil, потому что CSV.foreach возвращает nil, но это не указание, если цикл запущен или нет. Вы проверили, было ли создано Movie? Вы включили какие-либо отладочные строки, чтобы следить за процессом?

Возможно, вы захотите проверить вывод record.save (или позвонить record.save!), возможно, ошибки проверки не позволяют создать запись. Кроме того, если вы хотите, чтобы цикл, чтобы вернуть созданные записи, вы можете написать это (Рубин> = 1.8.7):

require 'csv' 
records = CSV.foreach('public/uploads/VideoTitles2.csv').map do |row|  
    Movie.create!({ 
     :media_format => row[0], 
     :title   => row[1], 
     :copies_at_home => row[2], 
     :order   => row[3], 
    }) 
end 
+0

хорошо модель/настольный фильм уже существует (я создал его раньше времени). однако я подтвердил, что ни одна из записей не была добавлена. по сути, это привело к стандартному контроллеру/представлению лесов, который выдавал ошибку – anxiety