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

PHP & Base de données Discussion :

Chargement d'un fichier vers une base SQL [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 90
    Points : 16
    Points
    16
    Par défaut Chargement d'un fichier vers une base SQL
    Bonsoir !

    Pour expliquer un peu le contexte, j'ai un fichier .csv à traiter.
    Il contient en gros :
    données A (plusieurs champs), données B (plusieurs champs)
    et je dois faire appel à un service web qui me retournera une valeur selon les données A et B.
    Donc 2 champs à rajouter au fichier : la valeur, ou si les données sont incomplètes un code erreur + un champs indiquant que la ligne a été modifiée (une fois qu'elle sera corrigé).

    Donc j'ai un gros fichier (plus de 10 000 entrées), chaque entrée à traiter, et surtout une gestion de toutes les entrées incomplètes pour les modifier et les retraiter. En premier lieu il est uploadé sur le serveur.

    J'ai donc pensé ensuite à charger cela dans une base SQL (mysql me parait suffisant). J'ai découvert la commande "LOAD DATA INFILE" (http://dev.mysql.com/doc/refman/5.0/fr/load-data.html) qui permet justement de charger très rapidement des gros fichiers .csv dans une table SQL.

    Mon soucis, j'aimerais ajouter le nom du fichier à chaque entrée dans la base, et j'ai pas l'impression que ca soit possible de faire ca directement avec le "LOAD DATA INFILE".

    Donc je me demande pour quelle solution opter ?
    1/ Je "LOCK" la table, je charge, j'update les 10K+ entrées avec le nom du fichier, et je la "UNLOCK"
    2/ Je charge dans une table temporaire, et je transfère vers une autre table
    3/ J'oublie le "LOAD DATA INFILE", et j'utilise plutot la fonction fgetcsv() et du coup j'insère comme je veux.

    J'ai fait des recherches la dessus mais je n'ai pas encore pu trancher et je viens donc solliciter votre aide ! Vu la taille du fichier la question de rapidité importe. Surtout que je sais pas encore comment ca se passerait si la connexion s'interrompt (faut que ca soit fiable).

    Merci d'avance pour les conseils que vous apporterez !

  2. #2
    Membre averti Avatar de rems033
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    513
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 513
    Points : 345
    Points
    345
    Par défaut
    Dans ton cas je pense que le plus judicieux serait d'utiliser la fonction fgetcsv afin de coder de manière conforme à ton optique cet import de données...

    Par contre je ne suis pas sûr que cela soit plus rapide en terme de chargement aux vues du nombre d'entrées...

    Bon courage

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Bonjour,

    Une autre solution :
    1. création d'une table dont la structure correspond au .CSV + les 2 colonnes nécessaires au traitement ;
    2. importation du .CSV dans cette table avec 'LOAD DATA INFILE ...' ;
    3. traitement des données sur cette table ;
    4. insertion des données valides dans la table définitive avec 'INSERT... SELECT...'. Une seule requête insère la totalité des lignes correspondant à la condition : http://dev.mysql.com/doc/refman/5.0/...rt-select.html;
    5. suppression des données de la table intermédiaire insérées dans la table définitive, avec la même condition que dans la requête précédente ;

    A la suite de cela, il ne reste dans la table intermédiaire que les lignes à traiter manuellement, et tu n'auras passé que très peu de temps sur la table définitive.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 90
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par jeca Voir le message
    Bonjour,

    Une autre solution :
    1. création d'une table dont la structure correspond au .CSV + les 2 colonnes nécessaires au traitement ;
    2. importation du .CSV dans cette table avec 'LOAD DATA INFILE ...' ;
    3. traitement des données sur cette table ;
    4. insertion des données valides dans la table définitive avec 'INSERT... SELECT...'. Une seule requête insère la totalité des lignes correspondant à la condition : http://dev.mysql.com/doc/refman/5.0/...rt-select.html;
    5. suppression des données de la table intermédiaire insérées dans la table définitive, avec la même condition que dans la requête précédente ;

    A la suite de cela, il ne reste dans la table intermédiaire que les lignes à traiter manuellement, et tu n'auras passé que très peu de temps sur la table définitive.
    merci pour cette solution intéressante ! quand je pensais à transférer je pensais à cela en effet.
    autant tout transférer dans la table définitive, cela pourra permettre de traiter plusieurs fichiers (quite à faire du web j'essaye d'ajouter des possibilités que ca pourrait gérer ) ?
    c'est à ce moment la que je me demandais si en terme de rapidité vallait mieux un LOAD DATA FILE + INSERT SELECT ou fgetcsv

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Je crois qu'il n'y a pas photo.
    Test effectué sur un fichier de 86836 lignes et 5 colonnes, sans création d'index :

    load data vers table intermédiaire => 0.14399 secondes
    insert Select de table intermédiaire vers table définitive => 0.01273 secondes
    fgetcsv vers table définitive => 135.05237 secondes

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 90
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par jeca Voir le message
    Je crois qu'il n'y a pas photo.
    Test effectué sur un fichier de 86836 lignes et 5 colonnes, sans création d'index :

    load data vers table intermédiaire => 0.14399 secondes
    insert Select de table intermédiaire vers table définitive => 0.01273 secondes
    fgetcsv vers table définitive => 135.05237 secondes
    merci pour l'info
    en effet j'ai testé avec LOAD DATA + INSERT SELECT et ca prenait moins d'une seconde donc je me suis dit que c'était parfait !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. convertir une base sqlserve .sdf vers une base sql server .mdf
    Par solitude dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/01/2010, 22h54
  2. uploader un fichier dans une base SQL server
    Par Flamby38 dans le forum ASP.NET
    Réponses: 9
    Dernier message: 25/09/2007, 17h16
  3. Import Excel vers une base SQL Server / Framework 1.x
    Par myNonSpace dans le forum Windows Forms
    Réponses: 6
    Dernier message: 08/06/2007, 11h27
  4. Réponses: 10
    Dernier message: 05/03/2007, 13h40
  5. Migrer un fichier excel vers une base sql serveur
    Par vdavid1982 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 12/07/2005, 16h26

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