Ich möchte eine Datei Zeile für Zeile lesen, ohne sie jedoch vollständig in den Speicher zu laden.
Meine Datei ist zu groß, um im Speicher geöffnet zu werden. Wenn ich dies versuche, werden immer Speicherfehler angezeigt.
Die Dateigröße beträgt 1 GB.
fgets()
ohne$length
Parameter verwenden.Antworten:
Mit der
fgets()
Funktion können Sie die Datei Zeile für Zeile lesen:quelle
too large to open in memory
Teil?quelle
if($file)
vor der while-Schleifefeof()
existiert nicht mehr?Sie können eine objektorientierte Schnittstellenklasse für eine Datei verwenden - SplFileObject http://php.net/manual/en/splfileobject.fgets.php (PHP 5> = 5.1.0)
quelle
eof()
in SplFileObject keine Funktion?rtrim($file->fgets())
diese Option auch, um nachfolgende Zeilenumbrüche für jede gelesene Zeilenzeichenfolge zu entfernen, wenn Sie sie nicht möchten.Wenn Sie eine große Datei öffnen, möchten Sie wahrscheinlich Generatoren neben fgets () verwenden, um zu vermeiden, dass die gesamte Datei in den Speicher geladen wird:
Verwenden Sie es so:
Auf diese Weise können Sie einzelne Dateizeilen innerhalb von foreach () verarbeiten.
Hinweis: Generatoren benötigen> = PHP 5.5
quelle
SplFileObject
Ansatz.Verwenden Sie Puffertechniken, um die Datei zu lesen.
quelle
Es gibt eine
file()
Funktion, die ein Array der in der Datei enthaltenen Zeilen zurückgibt.quelle
quelle
file()
.Die offensichtliche Antwort war nicht in allen Antworten vorhanden.
PHP verfügt über einen ordentlichen Streaming-Trennzeichen-Parser, der genau für diesen Zweck entwickelt wurde.
quelle
while (($line = stream_get_line($fp, 1024 * 1024, "\n")) !== false)
Seien Sie vorsichtig mit dem 'while (! Feof ... fgets ()' - Zeug, fgets können einen Fehler bekommen (returnfing false) und für immer eine Schleife ausführen, ohne das Dateiende zu erreichen. Codaddict war der Richtigkeit am nächsten, aber wenn Ihr 'while fgets' Schleife endet, überprüfen Sie feof; wenn nicht wahr, dann hatten Sie einen Fehler.
quelle
So verwalte ich mit sehr großen Dateien (getestet mit bis zu 100G). Und es ist schneller als fgets ()
quelle
Eine der beliebtesten Lösungen für diese Frage wird Probleme mit dem neuen Linienzeichen haben. Es kann ziemlich einfach mit einem einfachen behoben werden
str_replace
.quelle
SplFileObject ist nützlich, wenn es um den Umgang mit großen Dateien geht.
quelle
quelle
Funktion zum Lesen mit Array-Rückgabe
quelle