Seite 1 von 2

Zeilen txt löschen

Verfasst: 30.08.2017 18:01
von Fanpost
Hallo, ich suche ein Code-Beispiel um in einer txt-Datei eine bestimmte Zeilenanzahl von unten, z.B. die letzten 10, zu löschen. Kann mir da jemand behilflich sein?

Re: Zeilen txt löschen

Verfasst: 30.08.2017 18:16
von Mijikai
Mit

Code: Alles auswählen

TruncateFile(#Datei)
sollte das gehen.

Beispiel:

Code: Alles auswählen

Procedure.i CutFilePart(File.s,Length.i)
  Protected FileHandle.i = OpenFile(#PB_Any,File)
  If FileHandle
    If Length < Lof(FileHandle)
      FileSeek(FileHandle,Length)
      TruncateFile(FileHandle)
      CloseFile(FileHandle)
      ProcedureReturn #True    
    EndIf
    CloseFile(FileHandle)
  EndIf 
EndProcedure

Re: Zeilen txt löschen

Verfasst: 30.08.2017 18:46
von mk-soft
Ist ein wendig Kopfarbeit.
Normalerweise muss man alle Zeilen einmal durchgeben und Position der letzen 10 Zeilen merken.
Dann die Datei mit der gemerkten Position abschneiden (Truncate)

Bei sehr grossen Dateien ist das aber langsam.

Alternative die Datei Blockweise von hinten in ein Buffer laden und selber nach den Zeilenumbruch suchen

- Window #LFCR$
- Linux #LF$ oder #CR$
- MacOS #CR$ oder #LF$

Re: Zeilen txt löschen

Verfasst: 30.08.2017 20:44
von Fanpost
Danke. Da ich aber die Weisheit nicht mit Löffeln gefressen habe, brauche ich halt ein Code-Schnippsel

Re: Zeilen txt löschen

Verfasst: 30.08.2017 20:46
von Josh
mk-soft hat geschrieben:Alternative die Datei Blockweise von hinten in ein Buffer laden und selber nach den Zeilenumbruch suchen
Warum Blockweise? Datei komplett in einen Buffer laden und von hinten zu suchen beginnen.

Auf jeden Fall über Pointer arbeiten, bei Stringoperationen ist die Zigarettenpause sonst schon mitprogrammiert.

Re: Zeilen txt löschen

Verfasst: 30.08.2017 20:47
von NicTheQuick
Josh hat geschrieben:
mk-soft hat geschrieben:Alternative die Datei Blockweise von hinten in ein Buffer laden und selber nach den Zeilenumbruch suchen
Warum Blockweise? Datei komplett in einen Buffer laden und von hinten zu suchen beginnen.
Je nachdem wie groß die Datei ist, fände ich es Blockweise auch nicht schlecht.

Re: Zeilen txt löschen

Verfasst: 30.08.2017 21:04
von Josh
NicTheQuick hat geschrieben:Je nachdem wie groß die Datei ist, fände ich es Blockweise auch nicht schlecht.
Warum? Du musst ohnehin die ganze Datei laden, weil du ja das Ende benötigst. Wobei ich mal davon ausgehe, dass es keine Datei von 1 GB oder so ist :)

Re: Zeilen txt löschen

Verfasst: 30.08.2017 21:04
von GlassJoe
Also ich würde es so machen, daß ich ganz normal einlesen lasse und das gleichzeitig in eine linkedlist schmeisen, und alles bis auf die letzten 10 Positionen in eine >neue< (keine Experimente mit der Quelle) Datei schreiben.
Wenn es nicht grade riesige Dateien sind, geht es damit auch sehr schnell.

Code: Alles auswählen

  
  NewList bla.s()
  
  If ReadFile(0,"C:\proglist.txt") And CreateFile(1,"C:\somerandomfile.txt")
    ClearList(bla.s())
    While Eof(0) = #False
      a$ = ReadString(0)
      If a$
        AddElement(bla.s())
        bla() = a$ 
      EndIf 
    Wend
    Max = ListSize(bla.s())
    If Max > 10
      Max -1
      For Pos = 0 To Max -10
        SelectElement(bla.s(),Pos)
        Debug bla()
        WriteStringN(1,bla())
      Next 
    EndIf
    CloseFile(0)
    CloseFile(1)
  EndIf

Re: Zeilen txt löschen

Verfasst: 30.08.2017 21:51
von Fanpost
@ GlassJoe

Danke. Ich muss leider mit der "Quell-Datei" arbeiten

Re: Zeilen txt löschen

Verfasst: 30.08.2017 21:53
von GPI
Josh hat geschrieben:Warum? Du musst ohnehin die ganze Datei laden, weil du ja das Ende benötigst. Wobei ich mal davon ausgehe, dass es keine Datei von 1 GB oder so ist :)
Nö, wozu. Es wäre auch gut zu wissen, wie lange eine Zeile theoretisch sein kann. Wenn sie bspw. maximal 1000 Zeichen lang sein kann:
Mit FileSeek() 1000*10 vor das ende springen
Den block einlesen.
Von hinten her anfangen die Linefeeds zu suchen, diese zählen und die Position merken (Procode, wenn man die Zeilenlänge nicht kennt: blockende feststellen, Block davor laden und weitersuchen, aufpassen bei der Filepos-Berechnung! nicht verhauen)
mit fileseek() zu dieser Position springen (Achtung Speicherposumrechnung auf Filepos nicht verhauen)
mit TruncateFile() die datei kürzen

fertig.

Warum alles einlesen? wäre unsinn. Mit der Methode kannst du auch Terrabytegroße Dateien in sekunden bearbeiten.
Fanpost hat geschrieben:@ GlassJoe

Danke. Ich muss leider mit der "Quell-Datei" arbeiten
Zum testen aber eine Kopie machen und mit der arbeiten:)

Darf man fragen, was zur Hölle du da eigentlich löschen willst?