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