Michael: Unnötige Leerzeilen aus Textdatei löschen

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

  1. 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

    --
    Das Leben ist wie ein Kartenspiel: was dir gegeben wurde, ist vorbestimmt. Doch wie du damit spielst, ist deine Entscheidung.
    http://wwwtech.de/
    1. Hallo Christian,

      Danke für Deine schnelle Antwort, sie hat mir die Lösung meines Problems und einen Umdenkanstoss zur Optimierung beschert :-)))

      Gruss, Michael

  2. 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

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau