IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ruby on Rails Discussion :

importer CSV dans une base


Sujet :

Ruby on Rails

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    378
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 378
    Points : 94
    Points
    94
    Par défaut importer CSV dans une base
    Bonjour,
    je cherche un tuto ou exemple pour importer un fichier CSV dans une table.


    explication :
    à une adresse http://www.monsite.com/fichier.csv

    le fichier CSV (séparateur ; et le texte est encapsulé par des ")

    J'ai une table contacts
    id | nom | prénom | email | société | téléphone


    mon fichier CSV est de même structure

    Comment récupérer mon fichier et l'insérer dans ma table contacts


    Merci de votre aide

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    378
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 378
    Points : 94
    Points
    94
    Par défaut
    j'ai presque réussi mais je n'arrive pas à intégrer tout mon fichier CSV

    à chaque fois que je fais une tentative, j'ai entre 160 à 2880 lignes sur les 13000

    n'ayant pas trouvé comment faire pour la séparation point virgule, je suis passé en ,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    require 'csv'
    class CreateDonnees < ActiveRecord::Migration
      def self.up
        create_table :donnees do |t|
          t.column :produit, :string
          t.column :programme, :string 
          t.column :produit_numero, :string 
          t.column :produit_nom, :string
          t.column :produit_prix, :string
          t.column :produit_ancien_prix, :string
          t.column :produit_devise, :string
          t.column :produit_date_maj, :string
          t.column :produit_date_debut, :string
          t.column :produit_date_fin, :string
          t.column :produit_courte_description, :string
          t.column :produit_longue_description, :string                  
          t.column :produit_status, :string
          t.column :produit_categorie, :string
          t.column :produit_categorie_df, :string
          t.column :produit_small_image_url, :string
          t.column :produit_medium_image_url, :string
          t.column :produit_large_image_url, :string            
          t.column :produit_marque, :string
          t.column :produit_lien, :string
          t.column :produit_df_categorie_numero, :string
          t.column :produit_categorie_numero, :string
          t.column :produit_delai_livraison, :string
          t.column :produit_garantie, :string
          t.column :produit_ean, :string
          t.column :produit_voir, :string
          t.column :produit_frais_port, :string
          t.column :produit_texte_sup1, :string
          t.column :produit_texte_sup2, :string
          t.column :produit_texte_sup3, :string
        end
        ## 
      ### Import Data from CSV file 
      ### 
      CSV::Reader.parse(File.open("#{RAILS_ROOT}/db/donnees.csv", 'rb')) do |row| 
      this_row = { 
     
          :produit => row[0], 
          :programme => row[1],  
          :produit_numero => row[2],  
          :produit_nom => row[3], 
          :produit_prix => row[4], 
          :produit_ancien_prix => row[5], 
          :produit_devise => row[6], 
          :produit_date_maj => row[7], 
          :produit_date_debut => row[8], 
          :produit_date_fin => row[9], 
          :produit_courte_description => row[10], 
          :produit_longue_description => row[11],                   
          :produit_status => row[12], 
          :produit_categorie => row[13], 
          :produit_categorie_df => row[14], 
          :produit_small_image_url => row[15], 
          :produit_medium_image_url => row[16], 
          :produit_large_image_url => row[17],             
          :produit_marque => row[18], 
          :produit_lien => row[19], 
          :produit_df_categorie_numero => row[20], 
          :produit_categorie_numero => row[21], 
          :produit_delai_livraison => row[22], 
          :produit_garantie => row[23], 
          :produit_ean => row[24], 
          :produit_voir => row[25], 
          :produit_frais_port => row[26], 
          :produit_texte_sup1 => row[27], 
          :produit_texte_sup2 => row[28], 
          :produit_texte_sup3 => row[29]
      }
      donnee = Donnee.new(this_row) 
      donnee.save!  
      end 
     
      end
     
      def self.down
        drop_table :donnees
      end
    end

    Je suis ouvert à toutes propositions pour améliorer ceci.

    et surtout je cherche à savoir pourquoi toutes les données ne sont pas intégrées alors que je n'ai pas de message d'erreur => le script indique -> 0,0470s

    Merci

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 172
    Points : 219
    Points
    219
    Par défaut
    Bonjour,

    Cela me semble pas mal. Tu pourrais condenser un peu plus en utilisant la méthode "create" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CSV::Reader.parse(File.open("#{RAILS_ROOT}/db/donnees.csv", 'rb')) do |row|
    Donnee.create(:produit => row[0], :programme => row[1], etc ...)
    end
    Si tu veux utiliser le point virgule, il faut ajouter l'option le caractère ";" dans ton appel de la méthode parse, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CSV::Reader.parse(File.open("#{RAILS_ROOT}/db/donnees.csv", 'rb'), ';') do
     
    ...
     
    end
    De mon côté, je préfère utiliser une tache rake pour le chargement des données. Même si il est très tentant de procéder à cette tâche dans une migration, il est souvent déconseillé de mélanger le modèle des données et les données.

    Côme

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    378
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 378
    Points : 94
    Points
    94
    Par défaut
    Merci Côme,

    /****
    De mon côté, je préfère utiliser une tache rake pour le chargement des données. Même si il est très tentant de procéder à cette tâche dans une migration, il est souvent déconseillé de mélanger le modèle des données et les données.
    /*****

    Je vais partir dans ce sens mais je voulais déjà être certains que les choses fonctionnement correctement.

    Pour passer par une tache rake peux tu me donner une adresse expliquant comment faire cela

    A terme cela devra être automatisé (je pense utiliser un genre de cron mais il faut que je vois si il y a pas autre chose avec Ror)
    Merci

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 127
    Points : 124
    Points
    124
    Par défaut
    Tu trouveras une vidéo ici : http://www.railscasts.com/episodes/66
    Mon blog sur Ruby on Rails : 2dconcept

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    378
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 378
    Points : 94
    Points
    94
    Par défaut
    lors de l'execution de mon rake perso j'ai un problème pour acceder insérer.
    Je sais qu'il me manque quelque chose pour faire référence au model, je ne trouve pas la bonne syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     
    namespace :maj do
      desc "Mise à jour des données produits"
      task(:import_csv) do
    require 'csv'
     
        liste_fichier = ["donnee.csv"]
     
        for fichier in liste_fichier
     
          # Existent-ils ?
          if File.exists?("#{RAILS_ROOT}/db/#{fichier}")
            puts "Importation de #{fichier} !"
            CSV::Reader.parse(File.open("#{RAILS_ROOT}/db/#{fichier}", 'rb')) do |row| 
      donnee.create( 
     
          :produit => row[0], 
          :programme => row[1],  
          :produit_numero => row[2],  
          :produit_nom => row[3], 
          :produit_prix => row[4], 
          :produit_ancien_prix => row[5], 
          :produit_devise => row[6], 
          :produit_date_maj => row[7], 
          :produit_date_debut => row[8], 
          :produit_date_fin => row[9], 
          :produit_courte_description => row[10], 
          :produit_longue_description => row[11],                   
          :produit_status => row[12], 
          :produit_categorie => row[13], 
          :produit_categorie_zanox => row[14], 
          :produit_small_image_url => row[15], 
          :produit_medium_image_url => row[16], 
          :produit_large_image_url => row[17],             
          :produit_marque => row[18], 
          :produit_lien => row[19], 
          :produit_zanox_categorie_numero => row[20], 
          :produit_categorie_numero => row[21], 
          :produit_delai_livraison => row[22], 
          :produit_garantie => row[23], 
          :produit_ean => row[24], 
          :produit_voir => row[25], 
          :produit_frais_port => row[26], 
          :produit_texte_sup1 => row[27], 
          :produit_texte_sup2 => row[28], 
          :produit_texte_sup3 => row[29]
      )
     
      end 
     
          else
            puts "#{RAILS_ROOT}/db/#{fichier} n'existe pas"
          end
        end
      end
    end
    en exécutant le rake, j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Importation de donnee.csv !
    rake aborted!
    undefined local variable or method `donnee' for main:Object

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 172
    Points : 219
    Points
    219
    Par défaut
    Citation Envoyé par altair8080 Voir le message
    Pour passer par une tache rake peux tu me donner une adresse expliquant comment faire cela
    En fait ce n'est pas sorcier, puisque tu as accès à tous tes modèles directement. Personnellement j'ai créé un fichier "batchs.rake" dans "/lib/tasks". Mais on peu l'appeler comme on veut.

    Dans ce fichier, tu dois pouvoir écrire directement ton chargement depuis le CSV comme ceci (il faut faire un require "csv" quelque part, soit dans l'environnement, soit dans ton batch) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    namespace :batchs do
      desc "Batch applicatifs"
      task(:feed => :environment) do
        CSV::Reader.parse(File.open("#{RAILS_ROOT}/db/donnees.csv", 'rb')) do |row|
          Donnee.create(:produit => row[0], :programme => row[1], etc ...)
        end
      end
    end

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    378
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 378
    Points : 94
    Points
    94
    Par défaut
    Merci il me manquait
    => environnement

    et D au lieu de d

    maintenant que je peux importer mes données, je vais pouvoir travailler sur la partie metier. Merci

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    je travaille sur un projet et j'ai besoin moi aussi d'importer les donnees d'un fichier csv, j'ai copier ce code en essayant de le modifier mais j'ai eu beaucoup d'erreurs, est ce que je dois télécharger une librairie que je n'ai pas, et comment utiliser batch car j'ai pas bien saisi. j travailles avec myeclipse. Merci d'avance pour votre aide

Discussions similaires

  1. [Shell] import CSV dans une base de données.
    Par AngeDéchu dans le forum Shell et commandes GNU
    Réponses: 11
    Dernier message: 18/01/2012, 21h14
  2. [SQL-Server] importer csv dans une base de sql server avec php
    Par berroudji dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 21/06/2010, 09h23
  3. [AC-2000] PB lors de l'import d'un csv dans une base
    Par zandeparis dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/11/2009, 21h02
  4. [MySQL] Importer les données d'un fichier CSV dans une base de données
    Par joueur dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/11/2008, 11h59
  5. Amelioration d'une importation d'un CSV dans une base
    Par AngeDéchu dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 16/04/2008, 09h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo