Navigation
 Startseite
 Fachbücher
 Anzeigenmarkt
 Forum
 Webmaster News
 Script Newsletter
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Webhoster Vergleich
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Script Mods
 phpBB Adsense Mode

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 TLD Liste
 Webkatalog‑Verzeichnis

Partner
 Sprüche Treff

Artfiles.de
Bietet Serviceorientierte...
https://www.Artfiles.de
Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains...
https://www.Hosterplus.de
 
 
 

Dateien zeilenweise lesen mit fgets()

Sie befinden sich: Home > Php Tutorial > Dateien zeilenweise lesen...

Dateien zeilenweise lesen mit fgets()


Eintrag am:  26.10.2010
Hits / Besucher:  8917
Sprache:  Deutsch
Kategorie:  Einsteiger Tutorials
Tutorial Art:  eigenes
Eingetragen von   schubertmedia schubertmedia
 
Beschreibung

Wenn eine Datei nicht komplett auf einmal, sondern Zeile für Zeile gelesen werden soll, ist fgets() die richtige Wahl. Die Funktion liest von der aktuellen Position des Dateizeigers bis zum nächsten Zeilenumbruch und rückt den Zeiger automatisch weiter. Zusammen mit fopen(), feof() und fclose() entsteht ein einfaches Muster, das sich für viele Aufgaben eignet.

Das Grundmuster: fopen, fgets, fclose

Um eine Datei zeilenweise zu verarbeiten, wird sie zuerst mit fopen() im Lesemodus geöffnet. In einer Schleife liest fgets() jeweils eine Zeile, bis feof() das Dateiende meldet. Am Ende wird die Datei mit fclose() geschlossen.

<?php

$handle = fopen('logdatei.txt', 'r');

if ($handle === false) {
echo 'Datei konnte nicht geöffnet werden.';
} else {
while (!feof($handle)) {
$zeile = fgets($handle);
if ($zeile !== false) {
echo htmlspecialchars($zeile) . '<br>';
}
}
fclose($handle);
}
?>

Der zweite Parameter von fopen() gibt den Modus an: 'r' steht für reines Lesen. Der Dateizeiger wird an den Anfang gesetzt. Falls die Datei nicht existiert, gibt fopen() den Wert false zurück.

Maximale Zeilenlänge begrenzen

fgets() akzeptiert einen optionalen zweiten Parameter, der die maximale Anzahl der zu lesenden Bytes angibt. Das kann sinnvoll sein, um bei beschädigten Dateien ohne Zeilenumbrüche nicht den gesamten Speicher zu belegen.

<?php

$handle = fopen('daten.txt', 'r');

while (!feof($handle)) {
/* Maximal 4096 Bytes pro Zeile lesen */
$zeile = fgets($handle, 4096);
echo $zeile;
}

fclose($handle);
?>

Ohne den zweiten Parameter liest fgets() bis zum nächsten Zeilenumbruch oder bis zum Dateiende.

Praxisbeispiel: Logdatei durchsuchen

Beim Auswerten von Logdateien müssen oft nur bestimmte Zeilen verarbeitet werden. Mit fgets() kann die Datei zeilenweise gelesen und jede Zeile einzeln geprüft werden, ohne die gesamte Datei in den Speicher zu laden.

<?php

$handle = fopen('error.log', 'r');
$fehler = [];

while (!feof($handle)) {
$zeile = fgets($handle);
if ($zeile !== false && stripos($zeile, 'fatal') !== false) {
$fehler[] = trim($zeile);
}
}

fclose($handle);

echo count($fehler) . ' fatale Fehler gefunden:';
foreach ($fehler as $f) {
echo htmlspecialchars($f) . PHP_EOL;
}
?>

Da die Datei zeilenweise gelesen wird, funktioniert dieses Muster auch mit sehr großen Logdateien, die mehrere hundert Megabyte groß sein können.

Praxisbeispiel: Einfache Konfigurationsdatei lesen

Konfigurationsdateien im Format schluessel=wert lassen sich mit fgets() und explode() leicht einlesen.

<?php

$config = [];
$handle = fopen('app.conf', 'r');

while (!feof($handle)) {
$zeile = trim(fgets($handle));

/* Leere Zeilen und Kommentare ignorieren */
if ($zeile === '' || $zeile[0] === '#') {
continue;
}

$teile = explode('=', $zeile, 2);
if (count($teile) === 2) {
$config[trim($teile[0])] = trim($teile[1]);
}
}

fclose($handle);

echo $config['db_host'];
/* Ausgabe z.B.: localhost */
?>

CSV-Daten lesen mit fgetcsv()

Für Dateien im CSV-Format gibt es die spezialisierte Funktion fgetcsv(). Sie liest eine Zeile und zerlegt sie automatisch anhand eines Trennzeichens in ein Array.

<?php

$handle = fopen('produkte.csv', 'r');

/* Erste Zeile als Kopfzeile überspringen */
fgetcsv($handle, 0, ';');

while (($daten = fgetcsv($handle, 0, ';')) !== false) {
echo 'Produkt: ' . $daten[0]
. ' | Preis: ' . $daten[1] . PHP_EOL;
}

fclose($handle);
?>

Der dritte Parameter gibt das Trennzeichen an. In deutschsprachigen CSV-Dateien ist das oft ein Semikolon statt eines Kommas.

Moderne Alternative: SplFileObject

Seit PHP 5.1 bietet die Klasse SplFileObject einen objektorientierten Zugang zum zeilenweisen Lesen. Der Vorteil: Die Datei muss nicht manuell geöffnet und geschlossen werden.

<?php

$datei = new SplFileObject('logdatei.txt', 'r');

foreach ($datei as $nr => $zeile) {
echo ($nr + 1) . ': ' . htmlspecialchars($zeile);
}
?>

SplFileObject implementiert das Iterator-Interface und kann deshalb direkt in einer foreach-Schleife verwendet werden. Für neue Projekte ist das oft die sauberere Lösung.

fgets() oder file(): Wann was nehmen?

fgets() liest Zeile für Zeile und hält immer nur eine Zeile im Speicher. Das eignet sich für große Dateien, bei denen der Speicherverbrauch eine Rolle spielt.

file() liest die gesamte Datei auf einmal in ein Array. Das ist bequemer, verbraucht aber mehr Speicher. Für kleine Dateien bis einige Megabyte ist file() die einfachere Wahl.

file_get_contents() liest die gesamte Datei in einen einzigen String. Das eignet sich, wenn der Inhalt als Ganzes weiterverarbeitet werden soll, zum Beispiel für JSON-Daten oder Templates.

 

Tags:

 

Bücherregal mit drei Büchern: 'PHP 4 - Grundlagen und Profiwissen' von Hanser Verlag, 'Webdesign in a Nutshell' von O'Reilly Verlag, und 'Webgestaltung' von Galileo Computing.