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 :

traiter des fichiers CSV en POO : quelle conception est mieux ? [POO]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut traiter des fichiers CSV en POO : quelle conception est mieux ?
    Bonjour,

    comme mon titre l'indique, mon appli gère des fichiers CSV. En gros, elle les lit, les parse, teste la validité du contenu, écrit leur contenu en BDD (si valide), et met en lecture les informations.

    Avant d'écrire le contenu en BDD, elle teste le contenu pour vérifier sa validité. Il y a donc 2 accès au contenu du fichier : 1- pour tester la validité et 2- pour écrire en BDD.

    Mais problème de conception : au cours du parsage, je vais créer des instances d'objet, que je vais ensuite transmettre aux classes chargées du test de validité et de l'écriture en BDD. Ma question : vaut-il mieux créer une instance par ligne du CSV ou une seule pour le CSV entier ?
    Comme le nombre de lignes est variable, je pencherais plutôt par une seule instance pour le fichier entier, mais du coup, l'instance à transmettre va contenir des tableaux (un par type de données contenue dans le CSV) dont le nombre d'éléments sera le nombre de lignes du CSV. Et ces tableaux, il faudra les parcourir 2 fois : 1 fois pour tester la validité et une 2e fois, si c'est valide, pour écrire en BDD. Ca ne me semble pas économique en performance. Y a-t-il une meilleure conception, SVP ?

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Petite précision: Quand une ligne est incorrecte, que doit-il se passer? Est-ce qu'elle est simplement sautée, puis on continue de traiter les autres ou bien est-ce que l'intégralité du fichier csv est abandonné (et donc aucune insertion n'aura lieu en base de données provenant de ce fichier)?

  3. #3
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Tu fais bien de poser cette question qui me paraît judicieuse, même si sans y réfléchir, j'avais adopté la 2e option : si une erreur est détectée, aucune écriture en bdd (donc on abandonne le CSV). De toute façon, s'il y a une erreur, l'auteur du CSV devra corriger puis fournir une version corrigée qu'on mettra en bdd. Donc in fine, l'état de la bdd sera identique.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Par défaut
    Bonjour,

    Si aucune ligne ne doit être insérée en base dans le cas où il y en au moins une ligne en erreur... alors tu n'a pas le choix, il faut faire les choses en 2 temps.

    Par contre tu peux te contenter de faire qu’un seul INSERT, tu peux par exemple préparer toutes tes lignes "(nom_colonne_1, nom_colonne_2, ... VALUES ('valeur 1', 'valeur 2', ...)" lors du parcours de validation du fichier, puis les regrouper au moment de faire l'INSERT.

    Il y a un exemple ici : https://sql.sh/cours/insert-into
    dans le paragraphe "Insertion de plusieurs lignes à la fois"

    Alors attention par contre au nombre de ligne par Insert, à vérifier mais il me semble que cela peut être limité... du coup il vaudrait mieux partir sur une répartition des lignes sur plusieurs Insert, en espérant qu'il n'y ait pas une des requêtes qui échoue...

  5. #5
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse.
    D'abord, hier, en répondant à Cosmo, j'ai oublié une précision : même si on détecte une erreur, on continue à balayer les données pour repérer toutes les erreurs dans le CSV. Donc on n'abandonne l'écriture en BDD qu'à la fin du test de validité.

    Ensuite, OK pour un seul INSERT (en fait quelques-uns car pour simplifier mon exposé, j'ai parlé d'une seule table adressant le fichier CSV, mais en réalité, je répartis les informations sur 5 tables). En fait (merci de me dire si je me trompe), un ou quelques INSERTS par ligne du CSV, sachant qu'il y aura un enregistrement en BDD par ligne du CSV.

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Si tes fichiers sont de taille raisonnable tu peux les parcourir une fois , stocker en mémoire le contenu. Puis faire le test de validité et éventuellement l'insertion sur ce contenu en mémoire.
    Ou encore , parcourir le fichier , tester ligne à ligne et stocker en mémoire ce qui est ok , pour éventuellement ensuite insérer.

    Ce n'est vaalable que pour des fichiers de quelques Ko à quelque Mo , au delà il faudra les parcourir deux fois , pas le choix.

    Pour des gros fichiers on peut imagine ca :
    Tu lis ligne à ligne
    Tu vérifie la validité
    Tu écris la ligne validé dans un nouveau fichier csv.
    Tu donne ce fichier csv à mysql pour import si tout est ok.

    Note que pour ce genre de travail les generateurs sont top car il permettent de garder la mémoire basse
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/03/2007, 11h19
  2. Gestion des fichiers CSV
    Par sony351 dans le forum C++Builder
    Réponses: 5
    Dernier message: 02/11/2006, 10h11
  3. importe des fichier csv sous eclipse
    Par nael_n dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/08/2006, 13h57
  4. importer des fichier csv sous eclipse
    Par nael_n dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 11/08/2006, 13h00
  5. Réponses: 7
    Dernier message: 15/06/2006, 17h36

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