lemmy: Datei zeilenweise schreiben

Hallo,
ich möchte die Zeilen eines arrays in einer loop in eine Datei schreiben.
Ich dachte, dass bei jedem fwrite ein Neuer Satz geschrieben würde, allerdings wird alles fortlaufend aneinander geschrieben.
Wie erhalte ich tatsächlich einzelne Sätze, die dann auch beim Anzeigen in einem Editor als einzelne Zeilen dargestellt werden?

  1. Lieber lemmy,

    Du möchtest "Zeilenenden" schreiben. In PHP gibt es da eine vordefinierte Konstante PHP_EOL (ab PHP 4.3.10), die man bequem mit fwrite() in die Datei schreiben kann, um eine Zeile von einer anderen zu trennen.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hi Felix

      Du möchtest "Zeilenenden" schreiben. In PHP gibt es da eine vordefinierte Konstante PHP_EOL (ab PHP 4.3.10), die man bequem mit fwrite() in die Datei schreiben kann, um eine Zeile von einer anderen zu trennen.

      Zu diesem Thema habe ich aber jetzt gefunden:

      Don't use PHP_EOL for text-file output.
      IIRC it's better to use "\r\n" for best compatibility.
      You can DEFINE or $var it if you want.

      Gruß
      lemmy

      1. Hallo,

        Du möchtest "Zeilenenden" schreiben. In PHP gibt es da eine vordefinierte Konstante PHP_EOL (ab PHP 4.3.10), die man bequem mit fwrite() in die Datei schreiben kann, um eine Zeile von einer anderen zu trennen.

        Felix setzt hier implizit voraus, dass das Zielbetriebssystem das gleiche ist wie das Betriebssystem, auf dem PHP läuft. Immer und überall, wo Dein Code läuft.

        Don't use PHP_EOL for text-file output.
        IIRC it's better to use "\r\n" for best compatibility.

        wenn das Zielsystem der Textdatei Windows oder moderne Software ist :-)

        You can DEFINE or $var it if you want.

        Näheres zu Zeilenumbrüchen und den Feinheiten dabei findest Du im SELFHTML-Aktuell-Artikel Plattformübergreifendes Handling von Zeilenumbrüchen. Auch wenn sich dieser auf Perl bezieht, gilt dies analog für PHP.

        Freundliche Grüße

        Vinzenz

      2. Moin!

        Du möchtest "Zeilenenden" schreiben. In PHP gibt es da eine vordefinierte Konstante PHP_EOL (ab PHP 4.3.10), die man bequem mit fwrite() in die Datei schreiben kann, um eine Zeile von einer anderen zu trennen.
        Zu diesem Thema habe ich aber jetzt gefunden:

        Don't use PHP_EOL for text-file output.
        IIRC it's better to use "\r\n" for best compatibility.
        You can DEFINE or $var it if you want.

        Das ist richtig, das wäre auch meine Kritik an Felix Antwort gewesen.

        Ob es nun "\r\n" sein muss, oder nur "\n", das wäre vermutlich egal, aber dieser Wert ist wenigstens konstant, egal wo das Skript läuft.

        PHP_EOL hingegen ist unter Windows "\r\n", und unter Linux "\n". (Und wenn's noch Mac-Versionen für Mac-OS 9 und früher gäbe, wäre es dort "\r".) Wenn du also dein Skript unter Windows eine Datei erzeugen lässt, und dann Skript und Datei auf einen Linux-Server tust und die Datei wieder einliest, dann funktioniert es nicht, weil PHP_EOL sich dadurch verändert.

        - Sven Rautenberg

    2. Tach!

      Du möchtest "Zeilenenden" schreiben.

      Jein. Wenn bei Datensätzen wirklich Datensätze gemeint sind und nicht einfach nur "eine Zeile Text", dann wäre das CSV-Format sinnvoll. Für weitergehende Anforderungen käme auch SQLite in Frage.

      dedlfix.

  2. Hello,

    noch eine kleine Ergänzung zu den übrigen Tipps.

    ich möchte die Zeilen eines arrays in einer loop in eine Datei schreiben.

    Das hast Du scheinbar auch hinbekommen, wobei Arrays nicht wirklich "Zeilen" haben. Von Zeilen spricht man bei Tabellen oder mMn verwirrender Weise auch bei Textdateien. Denn Dateien haben in wirklichkeit auch keine "Zeilen".

    Man kann aber aus einem Array oder einer Datei "Zeilen" erzeugen - in der _Darstellung_.

    Ich dachte, dass bei jedem fwrite ein Neuer Satz geschrieben würde, allerdings wird alles fortlaufend aneinander geschrieben.

    Das ist richtig. Dateien bei den heute ünlichen Systemen stehen dem Programm als fortlaufend geschriebene Daten zur Verfügung. Erst die API des Programmes kann dabei beim Lesen wieder "Zeilen" erzeugen.

    Wie erhalte ich tatsächlich einzelne Sätze, die dann auch beim Anzeigen in einem Editor als einzelne Zeilen dargestellt werden?

    Du kannst die bereits erwähnten "Zeilenendezeichen" ("\r\n") einfüngen, Du kannst aber auch eine feste Satzlänge (Zeilenlänge) erzeugen, indem Du jeden Datensatz mit neutralen Zeichen (vornehmlich NULL) immer auf eine feste Länge auffüllst. Hierfür kennt PHP die Funktion

    http://de3.php.net/manual/en/function.str-pad.php

    Der Vorteil dieser _blockorientierten_ Datei ist, dass Du per einfacher Rechnung einen Direktzugriff auf den Anfang jedes Blockes (jeder "Zeile") hast.

    Diese "Ramdom Access Datei" verbraucht zwar i.d.R. enorm Speicherplatz, zeichnet sich aber durch extrem hohe Zugriffsgeschwindigkeit auf einzelne gezielte Datensätze (Zeilen) aus.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de