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

EDI, CMS, Outils, Scripts et API PHP Discussion :

Probleme de traitement CSV


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre averti
    Homme Profil pro
    BTS SIO SLAM
    Inscrit en
    Mai 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : BTS SIO SLAM

    Informations forums :
    Inscription : Mai 2015
    Messages : 11
    Par défaut Probleme de traitement CSV
    Bonjour à tous, j'ai quelques soucis avec un script PHP.

    Le contexte est le suivant :
    Je travaille avec le logiciel Apogee qui me fournit des notes étudiants dans un fichier A.csv
    Le fichier A est comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Login;Nom;Pr_nom;Note;Note;Note;Note;Note
    21204251;ABBASSI;ZACHARIE;10,6;9,2;12,5;10;13,6
    21204812;ABDALLA;SEEF;18,1;14,2;15,3;12,5;13,6
    21204464;ABDELMOUMEN;RAPHER;17,2;17,4;14,5;10,3;15,3
    21309863;ABERGEL;YOHANAN;12,5;11,5;11,4;11,1;7,8
    21405208;ABITTAN;DAVID ALEXANDER;11;10,8;6,7;10,3;13,3
    21205608;ABOU ALI;MOHAMED;15;13,2;13,1;14,2;12
    21205644;ABOU JAOUDE;MATHIEU;14,5;15;15;12;15,3
    21409604;AHDJOUDJ;MASSI;ABI;ABI;ABI;ABI;ABI
    21400841;AIT OUAHMANE;LAMIA;13,1;15,8;12,2;10,6;10

    Je dois comparer ce fichier A avec un autre fichier B.csv comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    login;nom;prenom;D1;D2;D3;D4;D5
    ie04251;Abbassi;Zacharie;52.8 %;99.8 %;62.5 %;50.0 %;68.1 %
    ie04812;Abdalla;Seef;90.3 %;70.8 %;76.4 %;62.5 %;68.1 %
    ie04464;Abdelmoumen;Rapher;86.2 %;86.8 %;72.3 %;51.4 %;76.4 %
    if09863;Abergel;Yohanan;62.6 %;57.7 %;56.9 %;55.6 %;38.9 %
    ig05208;Abittan;David Alexander;54.8 %;54.2 %;33.3 %;51.3 %;66.7 %
    ie05608;Abou Ali;Mohamed;75.0 %;66.0 %;65.3 %;70.8 %;59.8 %
    ie05644;Abou Jaoude;Mathieu;72.3 %;75.0 %;75.0 %;59.8 %;76.4 %
    ig00841;Ait Ouahmane;Lamia;65.3 %;79.2 %;61.2 %;52.8 %;50.0 %
    ie06935;Ait Sidhoum;Abdelhakim;77.8 %;79.2 %;73.7 %;75.1 %;72.3 %
    Constatons les différences entre les deux fichiers :
    A : Nom et Prenom en majuscules
    B : Nom et Prenom en minuscules

    A : Les notes sont sur un barême de 20/20
    B : Les notes sont sur un barême de 100%

    A : Le login 212 04251 (par exemple) correspond à
    B : Le login ie04251

    Je dois donc traiter les différentes notes :
    Je crée un fichier C.csv qui prendra la meilleure note des deux fichiers.
    Par exemple si l'étudiant X a une note de 18/20 dans le fichier A et seulement 5/20 dans le B.csv, alors C.csv prendra la valeur de 18/20.
    A l'inverse A.csv = 7/20 et B.csv = 19/20 alors C.csv prendra la note de 19/20

    Je garde dans C.csv le barême de 20 ainsi que les majuscules.
    Si un étudiant est présent dans A mais absent dans B, on l'affichera dans C.

    A l'inverse, je dois créer un fichier D.csv qui prendra en compte tous les étudiants présents dans B mais absents de A.

    Voici mon code :
    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
     
    <?php
    /* tableau de convertion des logins */
    $login_converter = array();
    $chars = 'abcdefghijklmnopqrstuvwxyz';
    for($i = 0; $i < strlen($chars); $i++)
      $login_converter['i'.$chars[$i]] = 208 + $i;
     
    /* fonction de préparation des données pour comparaisons */
    function prepare_datas($datas, $type)
    {
      global $login_converter;
      $students = array();
     
      // Explode coupe une chaine de caractères en segments
      foreach(explode("\r", $datas) as $student)
      {
        /* saute la première ligne du fichier */
        if(strtolower(substr($student, 0, 5)) == 'login')
          continue ;
     
        /* extrais les colonnes de la ligne */
        list($login, $nom, $prenom, $note_1, $note_2, $note_3, $note_4, $note_5) = explode(';', $student);
     
        /* stocke les données sous une forme exploitable pour les comparaisons */
        /* indexe les données sur nom-prenom pour un accès simple lors des comparaisons */
        $student_id = strtoupper($nom).'-'.strtoupper($prenom);
        $students[$student_id] = array(
          'login'  => $type == 'other' ? $login_converter[substr($login, 0, 2)].substr($login, 2) : $login,
          'nom'    => $nom,
          'prenom' => $prenom
        );
     
        /* stocke les notes en remplaçant les , par des . dans le cas d'apogée (pour comparaison numérique) et en les mettant /20 dans l'autre cas */
        for($i = 1; $i < 6; $i++) {
          $varname = 'note_'.$i;
          $note = $$varname;
          $students[$student_id][$varname] = $type == 'other' ? substr($note, 0, -2) / 5 : str_replace(',', '.', $note);
        }
      }
     
      return $students;
    }
     
    /* charge les fichiers */
    $students_a = prepare_datas(file_get_contents('testA.csv'), 'apogee');
    $students_b = prepare_datas(file_get_contents('testB.csv'), 'other');
     
    /* compare les données et met à jour $a en fonction des comparaisons faites avec $b */
    foreach($students_a as $student_id => $student_a)
    {
      /* si l'élève n'existe pas dans B on saute la ligne */
      if(!isset($students_b[$student_id]))
        continue;
     
      $student_b = $students_b[$student_id];
     
      /* mets à jour le login le cas échéant */
      if($student_b['login'] != $student_a['login'])
        $student_a['login'] = $student_b['login'];
     
      /* mets à jour les notes le cas échéant */
      for($i = 1; $i < 6; $i++) {
        if($student_b['note_'.$i] > $student_a['note_'.$i])
          $student_a['note_'.$i] = $student_b['note_'.$i];
     
        /* remet une , à la place du . */
        $student_a['note_'.$i] = str_replace('.', ',', $student_a['note_'.$i]);
      }
     
      /* met à jour l'étudiant dans le tableau d'origine */
      $students_a[$student_id] = $student_a;
    }
     
    /* enregistre les données à jour */
    // Fichier C avec absence des étudiants du B
    $fp = fopen('testC.csv', 'w');
    fputcsv($fp, array('Login','Nom','Prenom','Note','Note','Note','Note','Note'),';','"');
    foreach ($students_a as $student) {
      fputcsv($fp, $student, ';', '"');
      }
    fclose($fp);
     
     
    /* Gestion des étudiants absents de A */
    $students_d = array();
    foreach($students_b as $student_id =>$student_b)
    {
      /* si l'elève n'existe pas dans A on l'ajoute dans D */
      if(!isset($students_a[$student_id]))
        $students_d[] = $student_b; 
     
        for($i = 1; $i < 6; $i++) {
     
       $student_b['note_'.$i] = str_replace('.', ',', $student_b['note_'.$i]);
    }
    }
    // Fichier D avec présence des étudiants du B
    $handle = fopen('testD.csv', 'w');
    fputcsv($handle, array('Login','Nom','Prenom','Note','Note','Note','Note','Note'),';','"');
    foreach ($students_d as $student) {
      fputcsv($handle, $student, ';', '"');
    }
    fclose($handle);
     
    ?>



    Cependant quand je lance mon script j'ai différentes erreurs :

    Dans C.csv, les notes ne sont pas écrasées. Il n'y a presque jamais la meilleure note de A ou B

    Dans D.csv , c'est le chaos. Tout est en minuscule, toutes les notes sont à zéro.
    Je n'arrive pas à correctement insérer un "strtoupper" ou un "array_map" pour tout mettre en majuscule


    Je remercie par avance quelqu'un qui pourrait m'aider, j'ai essayé d'etre le plus clair possible

  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
    Par défaut
    Je te conseille de repartir du code que je t'avais écrit et que fonctionnait.
    Ton code actuelle est trop emberlificoté pour en faire quoi que ce soit.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

Discussions similaires

  1. Probleme de traitement d'image
    Par MessiJ dans le forum Images
    Réponses: 2
    Dernier message: 23/01/2008, 12h24
  2. Python probleme pour traitement fichier Xml avec l'API dom
    Par chenimitz dans le forum Général Python
    Réponses: 11
    Dernier message: 30/10/2007, 19h34
  3. probleme de traitement sequentiel des instructions
    Par marruecco dans le forum Général Java
    Réponses: 9
    Dernier message: 23/04/2007, 16h15
  4. Réponses: 2
    Dernier message: 03/09/2006, 11h02
  5. [Fichier] probleme de traitement de fichier
    Par stomerfull dans le forum Langage
    Réponses: 3
    Dernier message: 03/02/2006, 14h26

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