(Große) Dateien in PHP öffnen & lesen

Dateien öffnen & lesen

In diesem Tutorial möchte ich euch zeigen, wie ihr mit PHP Dateien öffnen und lesen könnt.

Für diese Aufgabe stellt PHP euch verschiedene Funktionen zur Verfügung. Der Anwendungsfall entscheidet, welche dieser Funktionen ihr nutzen solltet.

Gehen wir die verschiedenen Möglichkeiten einmal durch:

(Große) Dateien zeilenweise lesen

Wenn es darum geht große Dateien zu lesen ist es sinnvoll die Funktion fopen zu nutzen. Hier mal ein Beispiel:

Zunächst öffnen wir die Datei „datei.txt“ für den Lesezugriff. Eine Referenz zur Datei wird in der Variable $fh abgelegt.

Danach prüfen wir, ob das Ende der Datei erreicht wurde. Wenn nicht, lesen wir die Datei mit Hilfe der Funktion fgets zeilenweise weiter und speichern den Inhalt jeder Zeile in der Variable $line zwischen.

Wir können jetzt mit dem Inhalt von $line machen was wir möchten. Der einfachste Fall wäre es wohl, den Inhalt einfach wieder auszugeben.

Nachdem das Ende der Datei erreicht wurde, schließen wir die Datei.

Ich möchte an dieser Stelle noch einmal genauer auf die verwendeten Funktionen eingehen:

fopen

Mit fopen wird eine Verbindung zu der Datei hergestellt. Die Datei kann wie in diesem Fall eine ganz normale Textdatei sein. Es ist aber auch möglich eine URL zu öffnen und darauf die selben Operationen auszuführen, die auch auf einer Datei ausgeführt werden können.

Der Parameter „r“ sorgt dafür, dass wir Lesezugriff haben. Darüber hinaus sind auch noch andere Zugriffsarten möglich.

feof

Die Funktion feof prüft, ob das Ende einer Datei erreicht wurde und gibt entweder true oder false zurück. In unserem Fall wird die Datei also so lange gelesen, bis das Ende der Datei erreicht ist.

Wenn wir eine URL lesen gibt feof auch false zurück wenn es einen Timeout gibt und keine weiteren Daten mehr gelesen werden können.

fclose

Die Funktion fclose schließt eine Datei, die zuvor mit fopen geöffnet wurde. Nachdem diese Funktion aufgerufen wurde ist es nicht mehr möglich Daten aus einer Datei oder URL zu lesen.

fgets

Diese Funktion ermöglicht es uns die eigentliche Leseoperation durchzuführen. Mit fgets können wir uns jeweils eine Zeile der Datei zurückgeben lassen. Diese kann dann wie in unserem Fall in deiner Variable zwischengespeichert werden.

Wir können der Funktion fgets einen zweiten Parameter mitgeben und so die Anzahl an Zeichen, die pro Zeile eingelesen werden sollen festlegen. Möchten wir nur die ersten 40 Zeichen einer Zeile lesen, können wir fgets wie folgt aufrufen:

fgetss

Die Funktion fgetss ähnelt der Funktion fgets. Der Unterschied ist hier jedoch, dass fgetss HTML Tags und PHP Code heruasfiltert und nur den eigentlichen Text zurückgibt.

Dateien komplett lesen

Manchmal kann es sein, dass wir eine Datei haben, die nicht zeilenweise aufbereitet ist. Dann muss der komplette Inhalt einer Datei eingelesen und abgearbeitet werden.

Wenn wir also eine Datei haben, in welcher der komplette Inhalt in nur einer Zeile steht, dann können wir diesen wie folgt in einen String einlesen:

An dieser Stelle sei wieder darauf hingewiesen, dass wir mit file_get_contents auch den Inhalt von URLs lesen können.

Möchten wir nun den Inhalt in einen Array speichern um diesen wieder Element für Element durchgehen zu können, können wir folgendes machen:

Nun haben wir ein Array mit Elementen, die anhand der Zeichenkette „\n“ gesplittet wurden. Wir können aber anstatt von „\n“ auch jeden anderen String wählen, um den String in $file zu teilen.

Das gleiche Ergebnis erhalten wir auch, wenn wir folgendes ausführen:

Einen kleinen Unterschied zwischen den beiden vorgestellten Methoden gibt es aber noch. Das explode entfernt die Newlines am Ende einer Zeile. Bei der Verwendung von file ist das nicht der Fall. Hier ist es sinnvoll auf jedes Element nochmal die Funktion trim anzuwenden.

Zeilen parsen

Haben wir eine einzelne Zeile einer Datei in einer Variablen zwischengespeichert, können wir diese bearbeiten. Oft ist es nötig diese noch zu parsen, um diese in der gewünschten Form zu erhalten. Dazu ein Beispiel:

Best Practice

Da wir nicht immer davon ausgehen können, dass alles so läuft wie gewünscht, ist es sinnvoll zu prüfen, ob bestimmte Annahmen auch erfüllt sind.

Wenn wir eine Datei öffnen, sollten wir auch sicherstellen, dass diese existiert und geöffnet werden kann:

In der Praxis wird es aber wohl auch einfach ausreichen, den Rückgabewert von fopen zu prüfen und bei Erfolg die gewünschten Dateioperationen auszuführen:

So, das war das Tutorial zum öffnen und lesen von Dateien in PHP. Welche der hier vorgestellten Methoden ihr verwenden sollt, hängt immer davon ab wie euer Anwendungsfall ist.

Wenn ihr z.B. eine sehr große Datei mit PHP lesen wollt, so macht es keinen Sinn diese komplett einzulesen und dann abzuarbeiten. Ihr werdet dann wahrscheinlich auch in ein Memory Limit laufen. Große Dateien einfach zeilenweise mit fgets lesen.

Bild: Flickr / kelehen

Veröffentlicht von

Michael

Webentwickler & SEO

Ein Gedanke zu „Dateien öffnen & lesen“

  1. Schöne Übersicht!
    Wegen newlines bei file(…) könntest du noch die praktische flag „FILE_IGNORE_NEW_LINES“ und skip empty Lines erwähnen.
    $trimmed = file(’somefile.txt‘, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *