Zeile in einer Datei löschen?

3 Antworten

Vorgehensweise:

Öffne Datei zum Lesen, öffne Neue Datei zum schreiben, lock() beide Dateien, lies aus Datei 1, Zeilen die erhalten beleiben werden in Datei 2 geschrieben. Wenn fertig, lösche Datei 1, Benenne Datei 2 um und entferne Lock.

Achtung, das Umbenennen kann potentiell immernoch zu einem Race führen.

Man kann das Ganze auch inplace machen, indem man geschickt den Filepointer bewegt und dann inplace umherschiebt - nur willst Du dabei keinen Fehlerfall erleben :D.

ein datensatz hat doch eigentlich eine ID , beim löschen nimmt man die ID bzw vergleichbares primäre feld.

mit suchfunktion und matching ist man extrem auf der falschen seite , was passiert wenn der string auch noch woanders vorkommt ?

ich mach sowas immer mit einer XML struktur , einlesen als array von datensätzen. entsprechend wird die datei neu geschrieben aus dem veränderten array . direkte manipulations von dateien mit seek etc ist nicht zielführend .

fazit eintrag löschen im speicher und dann datei wieder schreiben .

Da gibt es mehrere Möglichkeiten.

Ob am effizientesten, weiß ich nicht, aber du könntest die Datei Zeilenweise lesen und alle Zeilen, die den Suchstring nicht enthalten, in einen Schreibpuffer schreiben. Nach dem Lesen der Datei schreibst überschreibst du sie mit dem Schreibpuffer.

Noch besser, aber in der Vorbereitung etwas aufwändiger wäre es, wenn du mit Regulären Ausdrücken arbeiten würdest. Dann liest du die Datei komplett und ersetzt die Zeile mit dem Match durch einen Leerstring und schreibst das Ergebnis zurück in die Datei (überschreiben).

Woher ich das weiß:Berufserfahrung – Programmierer
Anna332905 
Fragesteller
 14.01.2020, 14:09

Probiere ich gleich mal aus. Das könnte funktionieren.

1
Suboptimierer  14.01.2020, 14:15
@Anna332905

Als dritte Variante könntest du einmal schauen, ob du die Datei in ein Listenobjekt einlesen kannst.

Ein Listenobjekt ist so etwas ähnliches wie ein Textarray, nur mit mehreren Methoden, die zur Verfügung stehen. Als Trennzeichen gibst du das Zeilenendezeichen an.

Wenn das Objekt nicht sowieso schon eine Suche erlaubt und den Index mit dem Fund zurück gibt, iterierst du durch das Objekt. Das Listenobjekt hat meistens eine Methode, um eine Zeile zu löschen. Wenn es die Methode gibt, mit der man das Listenobjekt aus einer Datei heraus befüllen kann, gibt es ganz bestimmt auch eine, mit der du es in die Datei zurück schreiben kannst.

Vom Schema her:

  • Liste.Separator = "\n"
  • Liste.Load(Datei)
  • if Liste.Find(Text)>=0 then Liste.Delete(Liste.Find(Text))
  • Liste.SaveToFile(Datei)
0