Comment lire un gros fichier ligne par ligne?
Je veux lire un fichier ligne par ligne, mais sans complètement le chargement en mémoire.
Mon fichier est trop volumineux pour être ouvert dans la mémoire, et si vous essayez de le faire j'ai toujours des erreurs de mémoire insuffisante.
La taille du fichier est de 1 GO.
- voir ma réponse à cette link
- Vous devez utiliser
fgets()
sans$length
paramètre. - Vous souhaitez marquer comme réponse sur l'un des suivants?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
fgets()
fonction pour lire le fichier ligne par ligne:too large to open in memory
partie?fclose($handle);
trop 😉if($file)
avant la boucle whilefeof()
n'existe plus?Vous pouvez utiliser une interface orientée objet classe pour un fichier - SplFileObject http://php.net/manual/en/splfileobject.fgets.php (PHP 5 >= 5.1.0)
eof()
fonction dans SplFileObject ?rtrim($file->fgets())
à la bande de fuite des retours à la ligne pour chaque ligne de chaîne à le lire si vous ne voulez pas.Si vous êtes à l'ouverture d'un fichier de grande taille, vous voudrez probablement utiliser les Générateurs à côté de fgets() pour éviter de charger tout le fichier en mémoire:
L'utiliser comme ceci:
De cette façon, vous pouvez traiter chaque fichier de lignes à l'intérieur de la boucle foreach().
Remarque: les Générateurs nécessitent >= PHP 5.5
Utiliser des techniques de mise en mémoire tampon pour lire le fichier.
Il y a un
file()
fonction qui retourne un tableau de lignes contenues dans le fichier.Être prudent avec le " while(!feof ... fgets()' trucs, fgets pouvez obtenir un message d'erreur (returnfing faux), et en boucle, sans jamais atteindre la fin du fichier. codaddict était le plus proche d'être correcte mais quand votre "alors que fgets' la boucle se termine, vérifiez feof; si pas vrai, alors vous feriez une erreur.
La réponse la plus évidente n'était pas là, à toutes les réponses.
PHP est un pur streaming délimiteur analyseur de disponible faite pour exactement cet effet.
L'une des solutions populaires à cette question aura des problèmes avec le caractère de nouvelle ligne. Il peut être fixé assez facile avec un simple
str_replace
.Ce dont je gère avec de très gros fichier (testé jusqu'à 100G). Et il est plus rapide que fgets()
SplFileObject est utile quand il s'agit de traiter de gros fichiers.
Fonction à Lire avec le tableau de retour