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 :

Parser un fichier txt pour remplir une table: optimisation ?


Sujet :

Langage PHP

  1. #1
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut Parser un fichier txt pour remplir une table: optimisation ?
    Bonjour à tous,

    Je dois parser un txt de 35 000 lignes environ afin de remplir deux tables mysql.

    Chaque ligne du txt comprend une vingtaine de données séparées par ";"
    La première donnée est une sorte de préfixe :
    Si c'est A, on remplit la table A.
    Si c'est B, la table B

    Je fais :

    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
     
    $content = file($dossier.$file);
    foreach($content as $line){
            $part = explode(";", $line);
    	$prefix = $part[0];
    	switch($prefix){
            case "A":
    		$id = $part[1];
    		$nom = $part[2];
    		$adresse = $part[3];
    		$adresse2 = $part[4];
    		$lieu_dit = $part[5];
    		$code_postal = $part[6];
    		$ville = $part[8];
    		etc...
    	        mysql_query("INSERT INTO table A (id, nom...) VALUES (...)");
     
            break;
            case "B":
                   IDEM A mais avec dautres données
                   mysql_query("INSERT INTO table B (id, ...) VALUES (...)");
            }
    }
    Mais ca dépasse, sur mon serveur local (EasyPHP 5.3.8) le max_execution time pourtant réglé à 180 secondes.

    Comment pourrais-je optimiser tout ça ?
    Merci d'avance pour vos précieux conseils.

  2. #2
    Futur Membre du Club
    Femme Profil pro
    Analyste Programmeur
    Inscrit en
    Septembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Septembre 2011
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Bonjour ^^

    J'avais eu le même problème, j'avais trouvé une petite ligne magique...
    Ça m'avait permis de contourner le max_execution !
    Bonne journée =)

  3. #3
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Bonjour,

    Effectivement, c'est une idée...
    Mais cela n'empêche pas que mon code doit pouvoir être optimisé...
    Mais merci quand même !

  4. #4
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Il faut déjà éviter, comme dans ton script actuel, de faire 35000 requêtes d'insertion. Donc tu peux commencer par construire une requête d'INSERT avec plus d'une "values". Exemple :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO
       table1 (id, valeur)
    VALUES
       (1, "valeur1"),
       (2, "valeur2"),
       (3, "valeur3"),
       (4, "valeur4");

    Sinon, si ton fichier texte est un CSV correctement formé, tu peux faire un LOAD DATA INFILE.

  5. #5
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Bonjour,

    Un insert d'une valeur... et un update pour le reste ?
    Mon fichier est un .dat très bien formaté.
    Je vais regarder du côté de LOAD DATA INFILE , je ne connais pas.
    Merci !

  6. #6
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Citation Envoyé par renaud26 Voir le message
    Un insert d'une valeur... et un update pour le reste ?
    Heu, mais dans ce cas là tu n'auras qu'un seul enregistrement dans ta base. Non, quand tu fais un INSERT, tu n'es pas obligé de faire une seule requête par ligne insérée, tu peux insérer plusieurs lignes en une seule requête (cf le message au-dessus).

    En PHP, tu pourrais la construire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $sql = 'INSERT INTO table1 (id, valeur) VALUES';
     
    $sep = '';
    foreach ( $tDatas as $tData )
    {
       $sql .= $sep . '(' . $tData['id'] . ', "' . $tData['valeur'] . '" )';
       $sep = ', ';
    }
     
    mysql_query( $sql );
    (script rapide sans sécurisation des données)

  7. #7
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Ah, OK !!!
    Je teste de suite

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    c'est un CSV utilise fgetcsv et non explode

  9. #9
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    @stealth35 : merci, je vais tester aussi.

    @Bisûnûrs : pour ce qui est des inserts je gagne du temps et ça fonctionne impec. Le problème (mais je l'avais pas précisé au début) c'est que j'ai besoin de refaire un passage avec un update.

    Et comme je mets la requête INSERT dans une chaine que j'exécute avec un seul mysql_query, ça se passe après la boucle...donc après l'UPDATE. Et bien sûr ça va plus.

    A moins que tu saches comment créer le UPDATE aussi dans une chaîne que je pourrai exécuter après la boucle et le INSERT...

Discussions similaires

  1. [1.x] uploader un fichier pour remplir une table
    Par erictomcat dans le forum Symfony
    Réponses: 3
    Dernier message: 06/09/2011, 18h58
  2. exécuté un fichier xml pour remplir une table
    Par secondechance dans le forum Bases de données
    Réponses: 0
    Dernier message: 17/01/2011, 14h59
  3. [AC-2003] Requête pour remplir une table à partir d'un fichier Excel
    Par olivier777 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 07/09/2009, 10h52
  4. Réponses: 2
    Dernier message: 11/05/2009, 19h04
  5. Réponses: 2
    Dernier message: 07/07/2008, 18h24

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