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

Langage PHP Discussion :

Importation fichier CSV dans une base de données


Sujet :

Langage PHP

  1. #1
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut Importation fichier CSV dans une base de données
    Bonsoir je suis entrain de créer une importation d'un fichier csv contenant un champ nom et email.
    Les champs de db sont très simpliste avec name,email,activation.
    J'ai tester un script simple mais il ne lit qu'une ligne ou du moins enregistre une seule ligne dans la db
    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
    if (file_exists($file))
    		     $fp = fopen($file, "r"); 
    		 else{
    	       echo "Fichier introuvable !<br>Importation stoppée.";
    	       exit();
    	     }
    	     $name= '';
    	     $email= '';
    	     $activation = '';
    	     while (!feof($fp))
    	     { 
    	       $ligne = fgets($fp,4096); 
    	       $liste = explode( ";",$ligne);  
    	       $name .= $liste[0];
    	       $email .= $liste[1];
    	       $activation .= magixcjquery_string_convert::passTextGenerator(10,false);
    	       sn_db_register::adminDbReg()->i_register($name,$email,$activation);
    	     } 
    		fclose($fp);
    J'ai toujours le premier champs ou ligne qui s'insère mais pas le reste !
    C'est peut être mon fichier CSV qui n'est pas bon je ne sais pas trop
    je le joins
    Personnellement je trouve la méthode un peux limite surtout si j'ai un fichier de 25000 lignes
    Fichiers attachés Fichiers attachés
    Au petit déjeuner, je prend du PHP et au souper du jQuery.
    AFUP 2009 : Bien optimiser son code pour le référencement
    Mon projet open source de librairie PHP 5: magix cjquery

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Deja si c'est un csv, utilise les fonctions csv de php

    ensuite il faudrait que tu regardes les requetes que tu executes pour voir ce qui se passe precisemment.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut
    Merci je me suis inspiré d'une class trouvé sur le site de php seulement il me retourne un tableau vraiment pas pratique.
    pour bien faire il me faudrait une colonne avec $data[0] qui contiendrai tous les noms et $data[1] avec les emails tous avec un séparateurs.
    Je purrai alors les insérer sans problème en DB
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    class sn_controller_register{
    	function import_csv_member($file){
    		$csvIterator = new CsvIterator($file);
    		foreach ($csvIterator as $row => $data) {
    		    print_r($data);
    		}
    	}
    }
    class CsvIterator implements Iterator {
        const ROW_SIZE = 4096;
        /**
        * The pointer to the cvs file.
        * @var resource
        * @access private
        */
        private $filePointer = NULL;
        /**
        * The current element, which will
        * be returned on each iteration.
        * @var array
        * @access private
        */
        private $currentElement = NULL;
        /**
        * The row counter.
        * @var int
        * @access private
        */
        private $rowCounter = NULL;
        /**
        * The delimiter for the csv file.
        * @var str
        * @access private
        */
        private $delimiter = NULL;
     
        /**
        * This is the constructor.It try to open the csv file.The method throws an exception
        * on failure.
        *
        * @access public
        * @param str $file The csv file.
        * @param str $delimiter The delimiter.
        *
        * @throws Exception
        */
        public function __construct($file, $delimiter=';') {
            try {
                $this->filePointer = fopen($file, 'r');
                $this->delimiter = $delimiter;
            }
            catch (Exception $e) {
                throw new Exception('The file "'.$file.'" cannot be read.');
            }
        }
     
        /**
        * This method resets the file pointer.
        *
        * @access public
        */
        public function rewind() {
            $this->rowCounter = 0;
            rewind($this->filePointer);
        }
     
        /**
        * This method returns the current csv row as a 2 dimensional array
        *
        * @access public
        * @return array The current csv row as a 2 dimensional array
        */
        public function current() {
            $this->currentElement = fgetcsv($this->filePointer, self::ROW_SIZE, $this->delimiter);
            $this->rowCounter++;
            return $this->currentElement;
        }
     
        /**
        * This method returns the current row number.
        *
        * @access public
        * @return int The current row number
        */
        public function key() {
            return $this->rowCounter;
        }
     
        /**
        * This method checks if the end of file is reached.
        *
        * @access public
        * @return boolean Returns true on EOF reached, false otherwise.
        */
        public function next() {
            if (is_resource($this->filePointer)) {
                return !feof($this->filePointer);
            }
            return false;
        }
     
        /**
        * This method checks if the next row is a valid row.
        *
        * @access public
        * @return boolean If the next row is a valid row.
        */
        public function valid() {
            if (!$this->next()) {
                if (is_resource($this->filePointer)) {
                    fclose($this->filePointer);
                }
                return false;
            }
            return true;
        }
    }
    Le tableau est retourner comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array ( [0] => ken [1] => ken@monmail.com; barbie [2] => barbie@monmail.com; )
    Est ce du à mon csv ?
    PHPexcel ne permet il pas ce genre de chose sa m'éviterai bien des souci
    Pour l'instant je râme avec une belle bêtise
    Au petit déjeuner, je prend du PHP et au souper du jQuery.
    AFUP 2009 : Bien optimiser son code pour le référencement
    Mon projet open source de librairie PHP 5: magix cjquery

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu n'as pas indiqué le delimiteur.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut
    A quel niveau ? je l'ai bien indiquer dans le constructeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public function __construct($file, $delimiter=';') {
    A moins que ce soit dans le csv ?
    Au petit déjeuner, je prend du PHP et au souper du jQuery.
    AFUP 2009 : Bien optimiser son code pour le référencement
    Mon projet open source de librairie PHP 5: magix cjquery

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 305
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 305
    Points : 15 633
    Points
    15 633
    Par défaut
    Citation Envoyé par gtraxx Voir le message
    A quel niveau ? je l'ai bien indiquer dans le constructeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public function __construct($file, $delimiter=';') {
    A moins que ce soit dans le csv ?
    le problème est que tu as des " dans ton fichier CSV et la fonction fgetcsv utilise ce caractère comme délimiteur
    tu peux essayer de mettre le code suivant dans la classe, ça fonctionne pour ton exemple de fichier mais je ne sais pas si ça produit des effets secondaires
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            $this->currentElement = fgetcsv($this->filePointer, self::ROW_SIZE, $this->delimiter, ';');

  7. #7
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut
    C'est bizarre je ne vois pas les " dans le CSV en principe il ne doit pas y en avoir
    Voila le résultat plutôt inattendu avec la modification:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array ( [0] => ken [1] => "ken@monmail.com [2] => " barbie [3] => "barbie@monmail.com [4] => " )
    Esuite comment exploiter ce le résultat sachant que je doit récupérer le nom + email associé pour l'insertion.
    la requête est très simpliste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO sn_register_activation (name, email, activation) VALUE (:name,:email, :activation)
    Ce qui serai vraiment simple c'est d'avoir une clé spécifique du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array ( [0] => ken ['name'] => ken@monmail.com ['email']  ,  barbie['name']  => barbie@monmail.com['email']  )
    Afin de le manipuler dans le foreach :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $csvIterator = new CsvIterator($file,';');
    		foreach ($csvIterator as $row => $data) {
    		    $name = $data['name'];
                        $email = $data['email'];
    		}
    Au petit déjeuner, je prend du PHP et au souper du jQuery.
    AFUP 2009 : Bien optimiser son code pour le référencement
    Mon projet open source de librairie PHP 5: magix cjquery

  8. #8
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 305
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 305
    Points : 15 633
    Points
    15 633
    Par défaut
    Citation Envoyé par gtraxx Voir le message
    C'est bizarre je ne vois pas les " dans le CSV en principe il ne doit pas y en avoir
    ce fichier CSV est produit comment ?
    tu n'as pas la possibilité d'utiliser un autre format ?

    sinon essaye ça pour avoir un découpage par ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $contenu = file_get_contents('test.csv');
     
    $listeLigne = preg_split('/[\r\n]+/', $contenu);
     
    foreach ($listeLigne as $ligne) {
        var_dump(explode(';', $ligne));
    }

  9. #9
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut
    Ben la je l'ai fais avec office 2008 pour mac mais sinon je peux utiliser n'importe quel format.
    Que me conseillez-vous pour plus de facilité et limité les risques d'erreurs
    Au petit déjeuner, je prend du PHP et au souper du jQuery.
    AFUP 2009 : Bien optimiser son code pour le référencement
    Mon projet open source de librairie PHP 5: magix cjquery

  10. #10
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 305
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 305
    Points : 15 633
    Points
    15 633
    Par défaut
    est ce que tu as essayé le code que j'ai rajouté dans mon message précédant ?

    Citation Envoyé par gtraxx Voir le message
    Ben la je l'ai fais avec office 2008 pour mac mais sinon je peux utiliser n'importe quel format.
    Que me conseillez-vous pour plus de facilité et limité les risques d'erreurs
    essaye d'utiliser du XML, c'est facilement exploitable en PHP avec la bibliothèque http://php.net/simplexml

  11. #11
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut
    Le probléme avec le XML c'est que les personnes qui vont utiliser l'importation ne connaissent pas forcément ce langage.
    C'est pour l'importation d'une mailing list dans mon logiciel perso de la société.
    Le code ci dessus donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array(3) { [0]=>  string(3) "ken" [1]=>  string(16) ""ken@monmail.com" [2]=>  string(1) """ } array(3) { [0]=>  string(6) "barbie" [1]=>  string(19) ""barbie@monmail.com" [2]=>  string(1) """ }
    C'est vraiment bizarre les double quote surement du à office 2008 de mac

    Je viens d'essayer ceci :
    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
    class csv_import{
    	/**
        * The cvs file.
        * @var resource
        * @access private
        */
        private $fileOpen = NULL;
    	/**
    	 * Constructor
    	 * @param string $file
    	 */
    	public function __construct($file) {
            try {
                $this->fileOpen = fopen($file, 'r');
            }
            catch (Exception $e) {
                throw new Exception('The file "'.$file.'" cannot be read.');
            }
        }
        /**
         * reading file
         * @param $file
         */
        public function reading($file){
        	$content = fread($this->fileOpen, filesize($file)); 
        	return preg_split('/[\r\n]+/', $content);
        }
        /**
         * Destructor 
         */
        public function __destruct(){
        	fclose($this->fileOpen);	
        }
    }
    $import = new csv_import($file);
    		foreach ($import->reading($file) as $ligne) {
    		    $t = (explode(';', str_replace('"','',$ligne)));
    		    print $t[0].$t[1].magixcjquery_string_convert::passTextGenerator(10,false).'<br />';
    }
    Apparemment sa fonctionne mais question performance je ne sais pas trop.
    J'espère que sa supporte de gros fichier
    Au petit déjeuner, je prend du PHP et au souper du jQuery.
    AFUP 2009 : Bien optimiser son code pour le référencement
    Mon projet open source de librairie PHP 5: magix cjquery

Discussions similaires

  1. [AC-2010] Importer un fichier csv dans une base de données existante ACCESS
    Par rossy1990 dans le forum Access
    Réponses: 2
    Dernier message: 16/04/2014, 02h38
  2. [MySQL] Importer fichier excel dans une base de donne mysql
    Par arkhang dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 11/03/2014, 11h07
  3. [MySQL] Import de fichiers CSV dans une base de données
    Par damdam00 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 17/07/2010, 15h05
  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. Réponses: 6
    Dernier message: 18/07/2006, 20h32

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