Je veux lire un fichier ligne par ligne, mais sans le charger complètement en mémoire.
Mon fichier est trop volumineux pour être ouvert en mémoire, et si j'essaie de le faire, je sors toujours des erreurs de mémoire.
La taille du fichier est de 1 Go.
fgets()
sans$length
paramètre.Réponses:
Vous pouvez utiliser la
fgets()
fonction pour lire le fichier ligne par ligne:la source
too large to open in memory
pièce?la source
if($file)
avant la boucle whilefeof()
n'existe plus?Vous pouvez utiliser une classe d'interface orientée objet pour un fichier - SplFileObject http://php.net/manual/en/splfileobject.fgets.php (PHP 5> = 5.1.0)
la source
eof()
fonction dans SplFileObject?rtrim($file->fgets())
pour supprimer les sauts de ligne de fin pour chaque chaîne de ligne lue si vous ne les souhaitez pas.Si vous ouvrez un gros fichier, vous voudrez probablement utiliser Generators à côté de fgets () pour éviter de charger tout le fichier en mémoire:
Utilisez-le comme ceci:
De cette façon, vous pouvez traiter des lignes de fichiers individuelles à l'intérieur de foreach ().
Remarque: les générateurs nécessitent> = PHP 5.5
la source
SplFileObject
approche.Utilisez des techniques de mise en mémoire tampon pour lire le fichier.
la source
Il existe une
file()
fonction qui renvoie un tableau des lignes contenues dans le fichier.la source
la source
file()
.La réponse évidente n'était pas là dans toutes les réponses.
PHP a un analyseur délimiteur de streaming soigné disponible spécialement conçu à cet effet.
la source
while (($line = stream_get_line($fp, 1024 * 1024, "\n")) !== false)
Soyez prudent avec le truc 'while (! Feof ... fgets ()', fgets peut obtenir une erreur (returnfing false) et boucler indéfiniment sans atteindre la fin du fichier. Codaddict était le plus proche d'être correct mais quand votre 'while fgets' boucle se termine, vérifiez feof; si ce n'est pas vrai, alors vous avez eu une erreur.
la source
C'est comme ça que je gère avec un très gros fichier (testé jusqu'à 100G). Et c'est plus rapide que fgets ()
la source
L'une des solutions populaires à cette question aura des problèmes avec le nouveau caractère de ligne. Il peut être fixé assez facilement avec un simple
str_replace
.la source
SplFileObject est utile lorsqu'il s'agit de traiter des fichiers volumineux.
la source
la source
Fonction à lire avec retour de tableau
la source