2010-09-27 19 views
2

J'ai un modèle (appelé Test):importateur de FasterCSV au modèle DataMapper - Pas lignes insérées

property :id,   Serial 
property :title,  String,  :length => 255, :required => true 
property :description, String,  :length => 255, :required => true 
property :brand,  String,  :length => 255, :required => true 
property :link,   String,  :length => 255, :required => true 
property :image_link, String,  :length => 255, :required => true 
property :price,  String,  :length => 255, :required => true 
property :condition, String,  :length => 255, :required => true 
property :product_type, String,  :length => 255, :required => true 

Je l'importation de données à partir d'un onglet fichier délimité, en utilisant FasterCSV,

FasterCSV.foreach (» test.txt "{: headers => true,: quote_char => '"',: col_sep => '/ t'}) faire | row_data |

row_data = Test.first_or_new(
    'title' => :title, 
    'description' => :supplier, 
    'brand' => :brand, 
    'link' => :link, 
    'image_link' => :image_link, 
    'price' => :price, 
    'condition' => :condition, 
    'product_type' => :product_type 
) 

row_data.save

fin

Aucune erreur n'apparaît lorsque j'exécute l'importateur. Rien n'apparaît inséré dans la table SQLite.

Est-ce que je manque quelque chose d'évident? (La table existe dans la base de données cible et les noms des champs sont les mêmes que les en-têtes de mon fichier.)

Répondre

2

Mise à jour 2014/11/19: FasterCSV a été supprimé La bibliothèque standard Ruby CSV doit maintenant être utilisée dans Intead. Il suffit de remplacer toutes les occurrences de FasterCSV avec CSV

Il y a deux problèmes, je suppose

  • délimiteur vous l'intention d'utiliser était plutôt « \ t » que «/t »
  • vous n'utilisez pas la row_data à peupler l'objet DataMapper

Cela devrait fonctionner mieux:

FasterCSV.foreach("test.txt", {:headers => true, :quote_char=>'"', :col_sep =>"\t"}) do |row_data| 

    new_record = Test.first_or_new(
     'title' => row_data['title'], 
     'description' => row_data['supplier'], 
     'brand' => row_data['brand'], 
     'link' => row_data['link'], 
     'image_link' => row_data['image_link'], 
     'price' => row_data['price'], 
     'condition' => row_data['condition'], 
     'product_type' => row_data['product_type'] 
    ) 
    new_record.save 
end 
+0

Merci, j'ai utilisé votre version, avec le séparateur onglet correct et en utilisant la bonne façon de trouver les articles de la row_data. Bien que n'obtenant toujours rien d'important. Quoi qu'il en soit, obtenir FasterCSV pour produire des journaux, ou aurait-il erreur si les données étaient erronées? – Neil

+0

Oui, bien sûr, vous pouvez ajouter un "puts row_data.inspect" juste après la ligne foreach afin de retrouver ce que contient la table row_data. (par la façon dont le "\ t" signifie que vos champs sont séparés par des tabulations, est-ce correct?) – hellvinz

+0

Correct il est délimité par des tabulations, un exemple de sortie de ligne de FasterCSV confirme qu'il attribue les bonnes valeurs à chaque colonne lors de la lecture. Juste la méthode de sauvegarde semble ne pas entrer dans DataMapper. – Neil