Unnötige Leerzeilen aus Textdatei löschen
Michael
- php
0 Christian Kruse0 Michael
0 Tom
Guten Morgen,
Ich speichere meine Gästebuch-Einträge in einer Textdatei ab.
Nun ergibt sich die unangenehme Nebenerscheinung, aus welchen Gründen auch immer, dass immer wieder Leerzeilen zwischen den Einträgen gespeichert werden.
Ausgangspunkt war folgender Code:
$Neuer_Eintrag = "$Name|$Kommentar|$Erstellt_am|$Erstellt_um\n";
$Zeilen_in_Datei = file ($Gaestebuch_Eintraege);
$Anzahl_Eintraege = count ($Zeilen_in_Datei);
$Datei_Zeiger = fopen ($Gaestebuch_Eintraege, 'w+');
flock ($Datei_Zeiger, 2);
fwrite ($Datei_Zeiger, $Neuer_Eintrag);
for ($i = 0; $i < $Anzahl_Eintraege; $i++)
fwrite ($Datei_Zeiger, $Zeilen_in_Datei [$i]);
flock ($Datei_Zeiger, 3);
fclose ($Datei_Zeiger);
Bei 2 Einträgen sieht die Datei nun so aus:
b|b|30.10.2004|06:15.51|b|b|xxx|xxx|xxx
a|a|30.10.2004|06:15.43|a|a|xxx|xxx|xxx
Leerzeile
Leerzeile
Leerzeile
Ich habe die Datei nun in einem Texteditor komplett gelerrt und die for-Schleife um folgende Anweisung ergänzt:
if (! preg_match ("/^([:space:]*)\n$/", $Zeilen_in_Datei [$i]))
Damit sieht der neue for-Block so aus:
for ($i = 0; $i < $Anzahl_Eintraege; $i++)
{
if (! preg_match ("/^([:space:]*)\n$/", $Zeilen_in_Datei [$i]))
fwrite ($Datei_Zeiger, $Zeilen_in_Datei [$i]);
}
Bei Erstellung des 1. Eintrages wird auch nur der eine Eintrag ohne Leerzeile geschrieben.
Bei Erstellung des 2. Eintrages habe ich nach den Einträgen aber wieder eine Leerzeile:
b|b|30.10.2004|06:28.15|b|b|xxx|xxx|xxx
a|a|30.10.2004|06:27.28|a|a|xxx|xxx|xxx
Leerzeile
Bei Erstellung des 3. Eintrages sieht die Datei aber wieder so aus:
c|c|30.10.2004|06:29.41|c|c|xxx|xxx|xxx
b|b|30.10.2004|06:28.15|b|b|xxx|xxx|xxx
Leerzeile
a|a|30.10.2004|06:27.28|a|a|xxx|xxx|xxx
Leerzeile
Leerzeile
Wie kann ich verhindern, dass diese unnötigen Leerzeilen nicht in die Textdatei geschrieben bzw. gelöscht werden ?
Vielen Dank.
Gruss, Michael
Hallo Michael,
if (! preg_match ("/^([:space:]*)\n$/", $Zeilen_in_Datei [$i]))
Nenene. Wenn du [:space:] verwenden willst, dann musst du die ereg-Funktionen nutzen. Du
willst wahrscheinlich eher das hier:
if(preg_match("/^\s*$/",$Zeilen_in_Datei[$i]))
Ausserdem wuerde ich mir ueberlegen, ob du wirklich so arbeiten willst. Was, wenn dein
Gaestebuch 100000 Eintraege hat? Dann liest du auf einen Schlag 100000 Eintraege in den
Speicher. Nehmen wir an, jeder schreib 20 Zeichen + 10 Zeichen Nick + 10 Zeichen E-Mail,
dann hast du mal eben so ca. 4MB, die in den Speicher lesen musst. Sinnvoller waere es,
eine temporaere Datei anzulegen, den neuen Beitrag hineinzuschreiben und dann die alte
zeilenweise in die neue Datei zu schreiben. Am Ende wird die Datei dann umbenannt.
Grüße,
CK
Hallo Christian,
Danke für Deine schnelle Antwort, sie hat mir die Lösung meines Problems und einen Umdenkanstoss zur Optimierung beschert :-)))
Gruss, Michael
Hello,
$Neuer_Eintrag = "$Name|$Kommentar|$Erstellt_am|$Erstellt_um\n";
Bist Du sicher, dass Du nicht lieber CSV mit 'Delimiter' und 'Enclosure' und escapen der 'Enclosures' als Dateiformat nutzen willst?
Dann darf auch im Kommentar mal wieder eine Zeilenschaltung drinstehen und der Fehler wird an der Wurzel ausgemerzt und nicht mit "Kopfschmerztabletten".
Harzliche Grüße aus http://www.annerschbarrich.de
Tom