Vinzenz: datei: nur eine zeile auslesen

Beitrag lesen

Hallo Andi,

[ ] die erste Zeile
[x] eine beliebige Zeile //anhand einer NR, die übergeben wird aus der kompletten Übersicht des Inhaltes.
[ ] die letzte Zeile

hast Du eine Vorstellung, wie eine solche Textdatei für eine Anwendung aussieht? Es ist einfach eine Folge von vielen Zeichen. Bestimmte Zeichen bzw. eine bestimmte Zeichenkombination (je nach verwendetem Betriebssystem) zeigt ein Zeilenende an. Gut erklärt ist das in SelfHTML, siehe http://aktuell.de.selfhtml.org/artikel/cgiperl/zeilenumbruch/index.htm#newline.

Wie sieht eine Zeile Deiner Textdatei aus?
nr|name|titel|mail|web|nachricht

Du suchst also die Zeile, in der zu Beginn eine bestimmte Zahl (NR) steht. Dazu musst Du solange Zeile für Zeile lesen, den ersten Eintrag auswerten, bis Du zu der Zeile kommst, die als ersten Eintrag die gewünschte Nummer hat. Sind die Zahlen aufsteigend geordnet und lückenlos, dann musst Du die durch die Zahl bekannte Anzahl von Zeilen lesen.

Den ersten Eintrag bekommst Du mit Hilfe der Funktion explode(), die Dir auch alle anderen Einträge in Deiner Zeile in einem Array zurückliefert.

Wie Du recht einfach alle Zeilen Deiner Textdatei in ein Array einlesen kannst, hat Dir Arx im ersten Antwortposting bereits gesagt.

Nachdem Du so Deine gewünschte Zeile bekommen und zerlegt hast, kannst Du die Daten so in Deinem Formular darstellen, wie Du das haben möchtest.

Ich gehe davon aus, dass Du Deinen Kommentar in der entsprechenden Zeile abspeichern möchtest. Dort wartet das nächste Problem auf Dich:
Wie füge ich in eine Folge von Zeichen eine weitere Folge ein? Das geht leider nicht so einfach wie im Arbeitsbereich eines Editors. Du kannst nicht einfach sagen: "He, hier brauche ich noch Platz für 25 Zeichen in dieser Zeile." Ich skizziere kurz zwei häufig verwendete Methoden:

1. Lese die Datei mit file() in ein Array ein. Ändere nun den Arrayeintrag, der Deiner Zeile entspricht. Schreibe das Array in Deine Datei weg.

2. Lese die Daten zeilenweise aus Datei A. Bearbeite die Daten der Zeile, falls nötig. Schreibe die Zeile in eine temporäre, neu angelegte Datei B weg. Wenn die Datei A fertig gelesen und das Ergebnis fertig in der Datei B steht, dann lösche die Datei A und benenne die Datei B nach A um.

Auf die Vor- und Nachteile der beiden von mir vorgestellten Methoden möchte ich hier an dieser Stelle nicht eingehen. Du darfst Dir gerne selber Gedanken darüber machen.

so ich hoffe ich habe alles wie gewünscht beantwortet

Ja, hast Du. Und Du hast in der ersten Antwort von Arx bereits einen hervorragenden Tipp bekommen.

Fazit: Es ist nicht damit getan, eine einzige Zeile zu lesen.

Nur wenn alle Zeilen die gleiche Länge besitzen und zusätzlich die NR-Einträge lückenlos und aufsteigend sortiert sind und Dir der Wert der ersten Zeile bekannt ist, nur in diesem Fall könntest Du mit dem Lesen einer einzigen Zeile auskommen. Dann musst Du auch nur eine einzige Zeile wegschreiben.

In diesem Fall hättest Du eine ganz besondere Form einer sog. Random-Access-Datei vorliegen, d.h. eine Datei mit wahlfreiem Zugriff. Mehr zu solchen Dateien kannst Du, soweit ich mich erinnere, in dem von Arx verlinkten Megathread im Archiv finden. Selbstverständlich auch mit der Forumssuche oder der Suchmaschine Deiner Wahl.

Freundliche Grüsse,

Vinzenz