Bonjour,

je lis des fichiers CSV avec la fonction fgetcsv et je fais avec chaque ligne lue un traitement avec array_combine :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
while (($row = fgetcsv(self::$handle, $buffer, self::$separator, $enclosure)) !== false) {
                self::$data[] = array_combine(self::$header, $row);
            }

self::$header contient la première ligne du fichier CSV. Pour que array_combine fonctionne, il faut que les 2 tableaux (self::$header et $row) aient la même longueur. Le souci est que si le caractère \ est présent en fin d'une cellule d'une ligne du fichier CSV et que la dernière cellule est vide, la fonction fgetcsv ne lit pas les cellules suivantes de la ligne...donc évidemment, array_combine échoue.

Le caractère d'enclosure (ou encadrement) est ".

contenu d'une ligne du CSV qui fait planter :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
Mois de Months;Resolution;Resolution OLA Status;Resolution Op Cat Calculated
oct-21;"ISSUE: Outlook - Issue
CAUSE: user calling regarding Outlook, that every time the user tries to delete an email, it takes long time
RESOLUTION: screen share
CMD:
Cleaned %SystemRoot%\";2;
contenu du header :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
array(4) {
  [0]=>
  string(14) "mois de months"
  [1]=>
  string(10) "resolution"
  [2]=>
  string(21) "resolution ola status"
  [3]=>
  string(28) "resolution op cat calculated"
}
Les 4 cellules données par le header sont bien présentes dans la ligne du CSV. (bien noter que la dernière est vide)

Ligne $row retournée par fgetcsv:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
array(2) {
  [0]=>
  string(6) "oct-21"
  [1]=>
  string(189) "ISSUE: Outlook - Issue
CAUSE: user calling regarding Outlook, that every time the user tries to delete an email, it takes long time
RESOLUTION: screen share
CMD:
Cleaned %SystemRoot%\";2;
"
}
Quand fgetcsv a lu le CSV, il a ignoré le caractère d'encadrement ($enclosure) et donc au lieu de voir 4 cellules, il n'en a vu que 2.

Comment résoudre cela, SVP ?

A noter, qu'il n'y a pas de bug si la dernière cellule de la ligne n'est pas vide ou si le caractère \ ne termine pas la 2e cellule.