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 :contenu du header :
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;
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)
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" }
Ligne $row retournée par fgetcsv: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.
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; " }
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.
Partager