Textdatei Zeile löschen, überschreiben

Textdatei Zeile löschen, überschreiben

am 01.12.2006 19:15:04 von Stefan Binder

Hallo,

für einen Kunden arbeite ich gerade an "Datenbank" in Form
von einer Textdatei. Wenn mir vielleicht auf die schnelle eine
Lösung oder Ansatz für fplgendes hätte:

z.B. Textdatei:

klaus|müller|m
karl|muster|m
maria|magdalena|f

Ich suche nun den Eintrag von "karl", wie muss ich vorgehen um einen
Dateizeiger auf die Zeile "karl" zusetzen um
a) diesen zu löschen
b) diesen zu überschreiben ?

Ich könnte die Datei natürlich auch in Array einlesen,
ensprechenden Eintrag im Array löschen/verändern
und die Datei neu schreiben. Das würde ich aber gerne vermeiden!

Danke schonmal im Voraus!

Gruß Stefan

Re: Textdatei Zeile löschen, überschreiben

am 01.12.2006 20:13:28 von Michael Fesser

..oO(Stefan Binder)

>für einen Kunden arbeite ich gerade an "Datenbank" in Form
>von einer Textdatei. [...]
>
>Ich suche nun den Eintrag von "karl", wie muss ich vorgehen um einen
>Dateizeiger auf die Zeile "karl" zusetzen um
>a) diesen zu löschen
>b) diesen zu überschreiben ?
>
>Ich könnte die Datei natürlich auch in Array einlesen,
>ensprechenden Eintrag im Array löschen/verändern
>und die Datei neu schreiben. Das würde ich aber gerne vermeiden!

Das ist der einzig zuverlässige Weg, um Daten innerhalb einer Datei zu
manipulieren: einlesen -> ändern -> ausgeben.

Micha

Re: Textdatei Zeile löschen, überschreiben

am 01.12.2006 20:18:57 von Hadanite Marasek

Stefan Binder wrote:
> Hallo,
>
> für einen Kunden arbeite ich gerade an "Datenbank" in Form
> von einer Textdatei. Wenn mir vielleicht auf die schnelle eine
> Lösung oder Ansatz für fplgendes hätte:
>
> z.B. Textdatei:
>
> klaus|müller|m
> karl|muster|m
> maria|magdalena|f
>
> Ich suche nun den Eintrag von "karl", wie muss ich vorgehen um einen
> Dateizeiger auf die Zeile "karl" zusetzen um
> a) diesen zu löschen
> b) diesen zu überschreiben ?
>
> Ich könnte die Datei natürlich auch in Array einlesen,
> ensprechenden Eintrag im Array löschen/verändern
> und die Datei neu schreiben. Das würde ich aber gerne vermeiden!


Hallo,

aaalso, ich sehe da mehrere Lösungen. Du kannst beispielsweise hingehen
und Deine Datensätze anstelle in einem grossen Datensatz in
Einzeldateien speichern. Dann kannst Du einzelne Sätze löschen.

Die zweite Möglichkeit ist, dass Du mit festen Feldern arbeitest, also
sagst: Vorname sind max 20 Zeichen, Nachname sind max 20 Zeichen, das
m/f (vermutlich männchen/fräulein) ist 1 Zeichen lang. Dann brauchst Du
nicht mal mehr Trennzeichen und musst auch nicht mehr mit fgetcsv
durchiterieren, weil Du ja die Abstände kennst und direkt an eine
Adresse springen kannst (fseek($handle, $position)).

Einen Namen, der kürzer ist als die maximale Anzahl, kannst Du mit
Füllcharakteren Deiner Wahl auffüllen (z. B. \0). Überschreiben ist dann
einfach, an die entsprechende Stelle springen und einen neuen Datensatz
nach den gleichen Regeln überschreiben. Es versteht sich von selbst,
dass sinnigerweise kein Mensch mehr in der Struktur von Hand rumpfuschen
darf.

Löschen geht nicht ohne weiteres, denn Du kannst nicht einfach in der
Mitte was rausschneiden. Datenbanken arbeiten letzlich so, dass ein
Bereich nur als "gelöscht" markiert wird und bei einer Wartungsoperation
wird dann eine Kopie der alten Datei ohne die "gelöschten" Datensätze
erstellt und schliesslich über die ursprüngliche Datei verschoben.

Abschliessend kann ich aber nur sagen: tu es nicht. Hosting mit MySQL
bekommt man heute nachgeschmissen, so dass es kaum eine Rechtfertigung
für Flat Files gibt. Du handelst Dir nur Riesenärger ein...was ist, wenn
Du UTF-8 drin speichern willst, wie gehst Du mit Locks um (zwei Leute
wollen gleichzeitig ins Flatfile speichern), wie findest Du Datensätze
usw usf.

Re: Textdatei Zeile löschen, überschreiben

am 01.12.2006 20:26:04 von Stefan Binder

"Michael Fesser" schrieb im Newsbeitrag
news:4iv0n2p5eg11hjoc08huaon9qt12jms9d3@4ax.com...

> Das ist der einzig zuverlässige Weg, um Daten innerhalb einer Datei zu
> manipulieren: einlesen -> ändern -> ausgeben.
>
> Micha

Ok, ich habe es berfürchtet, dann werde ich in diesen sauren Apfel beisen...

....wobei ich unter zuverlässig etwas anderes verstehe! Gewisse
Betriebsysteme
könnten dabei abstürzen, dann wäre die ganze Datei zerstört ;-)

Danke!

Gruß Stefan

Re: Textdatei Zeile löschen, überschreiben

am 01.12.2006 20:32:57 von Rudi Menter

Am Fri, 01 Dec 2006 20:13:28 +0100 schrieb Michael Fesser:

> .oO(Stefan Binder)
>
>>für einen Kunden arbeite ich gerade an "Datenbank" in Form
>>von einer Textdatei. [...]
>>
>>Ich suche nun den Eintrag von "karl", wie muss ich vorgehen um einen
>>Dateizeiger auf die Zeile "karl" zusetzen um
>>a) diesen zu löschen
>>b) diesen zu überschreiben ?
>>
>>Ich könnte die Datei natürlich auch in Array einlesen,
>>ensprechenden Eintrag im Array löschen/verändern
>>und die Datei neu schreiben. Das würde ich aber gerne vermeiden!
>
> Das ist der einzig zuverlässige Weg, um Daten innerhalb einer Datei zu
> manipulieren: einlesen -> ändern -> ausgeben.

Es sei denn, die Datenbank ist wirklich extrem groß.

Sonst am besten einfach in einen String einlesen und dann mit
den üblichen wohlbekannten Stringfunktionen arbeiten...
- - - -

Re: Textdatei Zeile löschen, überschreiben

am 01.12.2006 20:37:29 von Rudi Menter

Stefan Binder:

> ...wobei ich unter zuverlässig etwas anderes verstehe! Gewisse
> Betriebsysteme
> könnten dabei abstürzen, dann wäre die ganze Datei zerstört ;-)

Hat doch damit nichts zu tun, denn du machst alle Änderungen,
und erst wenn das zur Zufriedenheit erfolgt ist, ersetzt du
die "alte" Datei, von der du ja natürlich vorher noch eine
(eigene) Sicherungskopie anlegen kannst...
- - - -

Re: Textdatei Zeile löschen, überschreiben

am 01.12.2006 20:41:19 von Stefan Binder

"Hadanite Marasek" schrieb im Newsbeitrag
news:ekpv71$4ac$03$1@news.t-online.com...

> Die zweite Möglichkeit ist, dass Du mit festen Feldern arbeitest, also
> sagst: Vorname sind max 20 Zeichen, Nachname sind max 20 Zeichen, das
> m/f (vermutlich männchen/fräulein) ist 1 Zeichen lang. Dann brauchst Du
> nicht mal mehr Trennzeichen und musst auch nicht mehr mit fgetcsv
> durchiterieren, weil Du ja die Abstände kennst und direkt an eine
> Adresse springen kannst (fseek($handle, $position)).
>
> Einen Namen, der kürzer ist als die maximale Anzahl, kannst Du mit
> Füllcharakteren Deiner Wahl auffüllen (z. B. \0). Überschreiben ist dann
> einfach, an die entsprechende Stelle springen und einen neuen Datensatz
> nach den gleichen Regeln überschreiben. Es versteht sich von selbst,
> dass sinnigerweise kein Mensch mehr in der Struktur von Hand rumpfuschen
> darf.

Um genau das rumpfuschen von Hand geht es dem Kunden leider...

> Abschliessend kann ich aber nur sagen: tu es nicht. Hosting mit MySQL
> bekommt man heute nachgeschmissen, so dass es kaum eine Rechtfertigung
> für Flat Files gibt. Du handelst Dir nur Riesenärger ein...was ist, wenn
> Du UTF-8 drin speichern willst, wie gehst Du mit Locks um (zwei Leute
> wollen gleichzeitig ins Flatfile speichern), wie findest Du Datensätze
> usw usf.

Den Ärger habe ich mir leider schon eingehandelt... :-( der hat MySQl
und bleibt stur! Hab ich mir wohl selbst eingebockt, so wird aus einem
Plan das dreifache an Zeit... eine Runde Mitleid bitte :-)

> Die zweite Möglichkeit ist, dass Du mit festen Feldern arbeitest, also
> sagst: Vorname sind max 20 Zeichen, Nachname sind max 20 Zeichen, das
> m/f (vermutlich männchen/fräulein) ist 1 Zeichen lang. Dann brauchst Du
> nicht mal mehr Trennzeichen und musst auch nicht mehr mit fgetcsv
> durchiterieren, weil Du ja die Abstände kennst und direkt an eine
> Adresse springen kannst (fseek($handle, $position)).
>
> Einen Namen, der kürzer ist als die maximale Anzahl, kannst Du mit
> Füllcharakteren Deiner Wahl auffüllen (z. B. \0). Überschreiben ist dann
> einfach, an die entsprechende Stelle springen und einen neuen Datensatz
> nach den gleichen Regeln überschreiben. Es versteht sich von selbst,
> dass sinnigerweise kein Mensch mehr in der Struktur von Hand rumpfuschen
> darf.

Dieser "Tip" ist sowohl logisch, als auch gut! Bringt mich in diesem Problem
nicht weiter.. aber in anderen zukünfigen bestimmt, hätte ich schon
gebraucht
und habs logisch nicht erfasst! Danke!

Gruß Stefan

Re: Textdatei Zeile löschen, überschreiben

am 01.12.2006 20:55:37 von Hadanite Marasek

> ...wobei ich unter zuverlässig etwas anderes verstehe! Gewisse
> Betriebsysteme
> könnten dabei abstürzen, dann wäre die ganze Datei zerstört ;-)

Nein....guck mal, wie Thunderbird das macht, sobald Du einen Ordner
compactest. Du legst einfach eine Kopie als temporäre Datei an und
schreibst sie dann mit move über die andere. Sollte Dir ein gewisses
Betrübssystem unterwegs abstürzen, hast Du nur eine temporäre Datei
rumgammeln.

Ansonsten wende noch den Rat an, Felder als gelöscht zu markieren.
Kannst ja ein zusätzliches Feld "gekillt" einbauen, denn wenn Du die
Datei bei jedem Schreibvorgang neu erstellst...naja, skaliert nicht
gerade sonderlich gut.

Re: Textdatei Zeile löschen, überschreiben

am 02.12.2006 11:37:54 von Chris Scholz

Hadanite Marasek schrieb:

> Die zweite Möglichkeit ist, dass Du mit festen Feldern arbeitest, also
> sagst: Vorname sind max 20 Zeichen, Nachname sind max 20 Zeichen, das
> m/f (vermutlich männchen/fräulein) ist 1 Zeichen lang. Dann brauchst Du
> nicht mal mehr Trennzeichen und musst auch nicht mehr mit fgetcsv
> durchiterieren, weil Du ja die Abstände kennst und direkt an eine
> Adresse springen kannst (fseek($handle, $position)).

Ich würde dringend dazu raten, wesentlich mehr als 20 Zeichen zu nehmen,
vor allem für die Nachnamen, bei den ganzen Doppel- und Dreifach-Namen,
die es so gibt.

Re: Textdatei Zeile löschen, überschreiben

am 02.12.2006 13:29:06 von Sebastian Wessel

Hadanite Marasek schrieb:
>
> Ich würde dringend dazu raten, wesentlich mehr als 20 Zeichen zu nehmen,
> vor allem für die Nachnamen, bei den ganzen Doppel- und Dreifach-Namen,
> die es so gibt.

Man bedenke alleine Frau Leutheuser-Schnarrenberger ...


MfG
Sebastian Wessel

--
Individualitaet ist ok, solange wir es alle zusammen tun
Major Frankling Burns (M*A*S*H)

Re: Textdatei Zeile löschen, überschreiben

am 02.12.2006 14:45:47 von Chris Scholz

Sebastian Wessel schrieb:
> Hadanite Marasek schrieb:
>>
>> Ich würde dringend dazu raten, wesentlich mehr als 20 Zeichen zu
>> nehmen, vor allem für die Nachnamen, bei den ganzen Doppel- und
>> Dreifach-Namen, die es so gibt.
>
> Man bedenke alleine Frau Leutheuser-Schnarrenberger ...

An genau die hatte ich auch gedacht...