2010-09-10 7 views
0

J'essaie d'utiliser le module CSV de Ruby pour importer les enregistrements contenus dans un fichier CSV vers ma table locale dans une application Ruby on Rails 3.Problème d'importation de fichier CSV avec Ruby CSV Module

La table a été créée grâce à la création du modèle Movie.

Voici ce que j'ai exécutaient dans la console:

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 

Les lignes du match de fichier csv (type de données) les colonnes qu'ils sont passés dans. Voici un je tente d'importer la version abrégée du fichier csv (VideoTitles2.csv):

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

où chaque enregistrement est séparé par \ n je crois. Ce fichier csv a été exporté à partir d'Access et son extension d'origine était .txt. Je l'ai manuellement changé en .csv pour l'amour de l'importation.

Le problème est que, après l'exécution des lignes ci-dessus dans la console de rails, je reçois la sortie suivante:

=> nil 

L'importation ne semble pas se produire. Si quelqu'un a une idée de comment je pourrais y remédier, je l'apprécierais vraiment.

Répondre

1

D'accord, il y avait deux choses que j'avais mal:

  1. Les fichier CSV exporté ne devrait pas avoir des citations autour des chaînes - Je les ai juste enlevés.

  2. Grâce à tokland, l'enregistrement.save! était nécessaire (par opposition à l'enregistrement.save que je faisais) - les erreurs de validation étaient empêchant les enregistrements d'être créés.

Pour conclure, on pourrait simplement créer la fonction suivante après la création du modèle/Table Film:

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 

Où les films.csv ressemble à ce qui suit:

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

alors appeler cette fonction dans la console en tant que telle:

Movie.import_movies() 

et, comme prévu, tout ce qui serait retourné dans la console serait:

=> nil 

Vérifiez votre index (si vous en avez créé un) et vous devriez voir que les enregistrements ont été importés avec succès dans la table des films.

+0

aucun contrôle de films répétés? aussi, c'est une bonne étiquette pour une fonction de rendre quelque chose de significatif. Peut-être le tableau des films nouvellement créés? peut-être juste le nombre? notez également que nouveau + enregistrer! = créer! – tokland

+0

ouais très vrai; Je l'utilisais comme une chose unique – anxiety

1

Je ne vois pas le problème. Cet extrait de code renvoie nil car CSV.foreach renvoie nil, mais cela ne signifie pas que la boucle est exécutée ou non. Avez-vous vérifié si un Movie a été créé? avez-vous inclus des lignes de débogage pour suivre le processus?

Vous pouvez vérifier la sortie de record.save (ou composer le record.save!), des erreurs de validation empêchent peut-être la création de l'enregistrement. En outre, si vous voulez que la boucle pour retourner les documents créés, vous pouvez écrire (Ruby> = 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

bien que le film modèle/table existe déjà (je l'ai créé à l'avance). Cependant, j'ai vérifié qu'aucun des enregistrements n'a été ajouté. en fait, il en résulte un contrôleur/vue d'échafaudage standard jetant une erreur – anxiety