Bonjour,
Afin de lire un fichier csv, contenant potentiellement de très nombreuses lignes, je souhaite lire N lignes à la fois et récupérer les données pour les traiter. puis lire les N lignes suivante, etc.
Le fichier csv est "standard" : X lignes de contenu séparé par des virgules
Avec la fonction file(), j'obtiens le résultat attendu mais le traitement des lignes csv est à prendre en compte (explode serait à ajouter)
c'est pourquoi je pensais à la fonction seek de SplFileObject :
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 function useFile($csvfile, $offset, $lines2read) { if (file_exists($csvfile)) { $tab = array(); $lines = file($csvfile); $max = count($lines); for($i=$offset;$i<$offset+$lines2read;$i++) { if ($i<$max && trim($lines[$i]) != '') { $tab[$i] = $lines[$i]; } } return $tab; } else return false; }
cette fonction me renvoie un tableau de tableaux d'élément de chaque ligne. C'est ce que j'attends.
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 function readFileSeek($csvfile, $offset=0, $lines2read=3) { if (file_exists($csvfile)) { $tab = array(); $file = new SplFileObject($csvfile, 'rb'); for($i=0;$i<$lines2read;$i++) { if (! $file->eof()) { $line= $offset+$i; $file->seek($line); $csvline = $file->fgetcsv(); $tab[$line] = $csvline; } } return $tab; } else return false; }
Sauf que pour une raison que je n'arrive pas à expliquer, si par exemple je veux lire 5 lignes, à partir du début
var_dump(readFileSeek($csvfile, 0, 5));
j'obtiens le contenu de la ligne 0, 2, 3, 4, 5 ! la fonction "saute" la 2eme ligne
Et c'est là même chose si je change la ligne de départ, ce sui signifie qu'il n'y a pas de problème de reconnaissance de fin de ligne.
Ce problème me laisse perplexe !
y'a t'il quelqu'un qui a une explication (et une solution) ?
Merci d'avance
Partager