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 :

analyse d'un CSV ligne à ligne mais construction d'un tableau des erreurs unique [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 497
    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 497
    Billets dans le blog
    1
    Par défaut analyse d'un CSV ligne à ligne mais construction d'un tableau des erreurs unique
    Bonjour,

    dans mon appli MVC de lecture de fichiers CSV, un contrôleur reçoit en entrée un fichier CSV ; il l'analyse ligne par ligne, ce qui veut dire qu'il transmet chaque ligne à une méthode du modèle ; celle-ci analyse la ligne et met à jour un tableau des erreurs (s'il y en a). Autrement dit, pour chaque ligne du CSV, une nouvelle instance de la méthode du modèle. Par contre, le tableau des erreurs est propre au fichier. La méthode du modèle va donc travailler dessus. Néanmoins, il existe avant l'instanciation de la méthode. Voici comment je m'y prend pour lui transmettre le tableau et que celle-ci travaille dessus.
    Je trouve la technique un peu lourde, donc si y a moyen de simplifier, je suis preneur.

    Code php : 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
               $this->data = $ref_parser->data();
                foreach ($this->data as $line_csv)
                {
                    extract($line_csv);
     
                    $ref_model_license_record = new Record($line_csv);
     
                    $this->errors = $ref_model_license_record->analyze($this->errors);/*la propriété errors appartient au
                     contrôleur. A chq ligne lue du CSV ($line_csv), une nouvelle instance de la classe du modèle Record.
                 Pour que celle-ci connaisse le tableau et le mette à jour :
                public function analyze($errors)
                {
                 $this->errors = $errors; //pour conserver les précédentes erreurs
                ...
                 $this->errors.= $new_error."##";
                ...
                return $this->errors;
               }        
    */

  2. #2
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    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 497
    Billets dans le blog
    1
    Par défaut
    J'imagine une amélioration : passer à la méthode de la classe du modèle (Record.php) une référence sur une instance du contrôleur et celui-ci ayant un getter et un setter sur sa propriété "tableau des erreurs". Cette idée tient-elle la route, et si oui, comment l'implémenter, SVP ?

  3. #3
    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
    Salut, plusieurs problèmes dans ton énnoncé :

    un contrôleur reçoit en entrée un fichier CSV ; il l'analyse ligne par ligne
    Ce n'est pas le role du controller de lire le fichier ligne par ligne mais celui de ton model/parser.

    Autrement dit, pour chaque ligne du CSV, une nouvelle instance de la méthode du modèle
    La ca veux dire que tu créer un objet par ligne de ton CSV. C'est tolérable si ton csv est petit mais imaginons un jour un CSV de 100 000 lignes, ca veux dire 100K objet créer et donc autant de mémoire consommé. En réalité le garbage collector devrait faire son travail , mais tu t'expose a des risques d'insuffisance de mémoire disponible.

    Je ne connais pas ce que tu fais mais la théorie voudrais que :

    - Controller recois le fichier
    - Controller passe le fichier au parser CSV
    - Le parser analyse le fichier , en extrait les données , stock éventuellement des erreurs
    - Le parse retournes les données et les erreurs au controller si il en a besoin.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    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 497
    Billets dans le blog
    1
    Par défaut
    Merci Grunk pour ta réponse ; j'étais justement en train d'écrire la solution que je venais de trouver !

    Citation Envoyé par grunk Voir le message
    Ce n'est pas le role du controller de lire le fichier ligne par ligne mais celui de ton model/parser.
    D'accord car en fait, je m'étais mal exprimé : quand je disais
    un contrôleur reçoit en entrée un fichier CSV ; il l'analyse ligne par ligne
    en réalité, le contrôleur ne se charge pas de l'analyse mais la délègue à une classe du modèle...

    J'ai finalement trouvé une technique, pas forcément plus simple, mais plus propre.

    La classe du modèle (Record.php), quand elle est instanciée, reçoit en paramètre le tableau des erreurs et le copie dans une propriété :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     public function __construct( array $data, $tab_errors )
        {
            $this->data = $data;
            $this->errors = $tab_errors;
        }
    donc elle le connaît et quand la méthode du modèle (analyze() ) le met à jour, elle le retourne afin que la version à jour du tableau soit disponible.

  5. #5
    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
    Tu pourrais passer ton tableau par référence ce qui éviterais de devoir le copier et de devoir la retourner.

    Ce n'est pas une méthode que l'on utilise beaucoup en PHP car elle est très souvent implicite (avec les objets par exemple).
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    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 497
    Billets dans le blog
    1
    Par défaut
    J'avais déjà répondu mais oublié d'envoyer. Cela dit, j'ai implémenté cette idée de passage par référence, telle que je l'avais comprise, et petit problème. Donc merci de me corriger.

    Selon moi, le passage par référence, il fallait le faire sur la méthode du modèle chargée de l'analyse du CSV. Comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     public function analyze(&$tab_errors )
    et du coup, au lieu de travailler sur une variable interne qu'elle retourne à la fin, la méthode travaille directement sur cette variable. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $new_error = $ref_Application->errors();
                $tab_errors.= $new_error."##";
    Sauf que ça se termine par un message d'erreur (que je donne pas car sans le contexte, ça aide pas). C'est juste une indication qu'on s'y est mal pris.

  7. #7
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    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 497
    Billets dans le blog
    1
    Par défaut
    Le message d'erreur qui apparaît est en fait du au fait que l'on ne passe par le bon chemin, et ça vient du fait qu'une méthode de la classe du modèle retourne false au lieu de true. Or cette méthode travaille justement sur la variable à passer par référence :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      public function hasErrors(): bool
        {
            return ! empty($this->errors);
        }
    Cela prouve que le passage par référence est mal géré. Qu'aurait-il fallu faire, STP ?

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/10/2014, 09h56
  2. Réponses: 1
    Dernier message: 21/05/2007, 10h44
  3. [MySQL] Erreur d'argument sur une ligne mais quelle
    Par spirou34fr dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 10/01/2007, 07h24
  4. [SQL2K] recopier une ligne, mais pas complètement
    Par Monstros Velu dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/10/2006, 12h54
  5. [MySQL] changer du texte soi-même en ligne, mais....?
    Par midiweb dans le forum Administration
    Réponses: 7
    Dernier message: 16/03/2006, 07h47

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