kostenloser Webspace werbefrei: lima-city


Auslesen bestimmter Zeile einer Datei

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    s******r

    Hall?le, meine Suche blieb erfolglos - hoffe nichts ?bersehen zu haben. Ich schreibe gerade einem Freund ein Script, f?r jenes eine mySQL-db recht sinnvoll w?re. Da es auch um Datens?tze geht, die sich aus mehreren Feldern ergeben. Leider hat er nur Zugriff auf PHP, jedoch nicht auf eine Datenbank. Daraufhin habe ich mal meine B?cher gewelzt, und denke mit implod u. explod w?re es machbar. Da ich dort ja auch mehrere Daten per Trennzeichen zu einem Datensatz pro zeile zusammen f?gen kann..

    Nu aber endlich zur Frage:
    Ich wei? zwar wie ich die erste Zeile, bzw. alle Zeilen auslesen kann - jedoch nicht, wie ich eine bestimmte Zeile angeben kann. Da k?nnt ihr mir sicher helfen,oder? :confused:
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Du kannst Dateien nur sequentiell lesen. Es gibt zwar die M?glichkeit mit fseek den Dateizeiger auf ein bestimmtes Byte zu setzen, aber Du wei?t ja leider in der Regel nicht, bei welchen Bytes neue Zeilen anfangen (oder doch? Kann sein, wenn Du eine feste Zeilenbreite, also alle Zeilen gleichviel Zeichen haben).

    Du musst also die Datei zeilenweise einlesen, solange bis die gew?nschte Zeile auftaucht.
    Nat?rlich verbraucht das viel Performance, aber Du kannst Dir z. B. ein Hash auf die Zeilenanf?nge basteln, wenn Du oft in der Datei springen mu?t.

    Pseudocode (ungepr?ft):

    // Initialisierung
    $zeilenanfang = array(); // leeres Array
    $i = 0; // Zeilenz?hler
    $dat = fopen("meineDaten.txt", "r");
    while (!feof($dat)) {
    $zeilenanfang[$i++] = ftell($dat); // akt. Position in Datei ermitteln
    fgets($dat); // n?chste Zeile einlesen, R?ckgabe verwerfen
    }


    // Zugriff auf Zeile n
    $pos = $zeilenanfang[n];
    fseek($pos);
    $Zeile = fgets($dat);


    So, das alles in eine Klasse gepackt. Dann die Initialisierung noch "lazy" machen und evtl. eine Methode rehash machen und noch das Schreiben erlauben.
  4. Autor dieses Themas

    s******r

    W?rde es so auch gehen:
    Wenn ich eine weitere Datei einbeziehe mit einem Z?hler, der bei jedem Eintrag sich um 1 erh?ht. Die Zahl w?rde ich im Array immer als erstes packen, bevor ich es imploden tu. Somit w?rde ja jeder Datensatz mit einer ID beginnen, das ich geziehlt darauf zugreifen kann, und auch Datens?tze ?ndern und l?schen kann....

    Sehe ich das richtig?

  5. schucker schrieb:
    W?rde es so auch gehen:
    Wenn ich eine weitere Datei einbeziehe mit einem Z?hler, der bei jedem Eintrag sich um 1 erh?ht. Die Zahl w?rde ich im Array immer als erstes packen, bevor ich es imploden tu. Somit w?rde ja jeder Datensatz mit einer ID beginnen, das ich geziehlt darauf zugreifen kann, und auch Datens?tze ?ndern und l?schen kann....

    Sehe ich das richtig?


    So ganz habe ich das nicht verstanden. Da alle Zeilen ja hintereinander stehen, hast Du doch eine ID, n?mlich die Nummer der Zeile. Die ist eindeutig.

    Was Du machen kannst ist folgendes:
    Du hast zwei Dateien, einmal die Daten und einmal einen Index.

    Schreiben:
    aus Deinen Daten bastelst Du eine Zeile (Achtung, evtl. Zeilenumbr?che maskieren) und h?ngst sie an die Datendatei einfach an. Der Index wird um 1 erh?ht und bekommt die alte Dateigr??e als Wert.

    $i = <zeigt auf den letzten Index>;
    $index[$i++] = file_size("meineDaten.txt");
    fputs($Zeile, $datenfile);

    Lesen der Zeile n:
    entsprechenden Index suchen und Zeile lesen:

    $pos = $index(n);
    fseek($datenfile, $pos);
    $zeile = fgets($datenfile);


    L?schen von Zeile n:
    $index[n] = null; // nur der Index ist gel?scht, Zeile noch da
    index neu durchnumerieren


    ?ndern von Zeile n:
    Zeile n lesen, Inhalt merken
    Dateigr??e ermitteln
    Inhalt ?ndern
    $pos = file_size("meineDaten.txt"); // Dateigr??e ermitteln
    ge?nderte Zeile an Datei anh?ngen
    $index[n] = $pos

    ?ndern, L?schen und Schreiben funktioniert nur, wenn Du sicherstellen kannst, das nicht zwei Skripte zur gleichen Zeit laufen. Du solltest Dir dazu flock() anschauen.

    Bei diesem Ansatz wird die Datei immer gr??er, es empfiehlt sich also hin und wieder die Datei umzukopieren und dabei die nicht im Index existenten Zeilen dabei wegzulassen und neu zu numerieren.

    Einfache Datenbanken funktionieren genau so. Wenn Du Daten mit wirklichen IDs haben m?chtest, die sich mit der Zeit nicht ?ndern (wenn man z. B. umkopiert), solltest Du diese zu Deinen Daten packen (wie Du es wolltest) und einen zweiten Index haben:

    Index 1:
    Schl?ssel: 0-Anzahl der Datens?tze
    Werte: Position in der Datei

    Index 2:
    Schl?ssel: beliebiges eindeutiges Datum, welches Du frei w?hlen kannst.
    Werte: indexposition


    Beispiel meineDaten.txt

    Zeile: (ID, Name, Telefonnummer):
    0:1,Horst,1234
    1:2,Sabine,4537
    2:4,Dirk,4567
    3:1,Horst, 6677

    Horst hat eine neue Telefonnummer, ge?nderter Datensatz. Datensatz mit ID 3 gibts nicht.

    index
    0 -> 36 // zeigt auf Zeile 3
    1 -> 13 // Zeile 1
    2 -> 26 // Zeile 2

    index f?r ID
    1 -> 0
    2 -> 1
    4 -> 2

    Am Anfang des Skripts musst Du nat?rlich die index-Dateien einlesen und am Ende wieder speichern.
  6. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!