Zeilen txt löschen

Anfängerfragen zum Programmieren mit PureBasic.
Fanpost
Beiträge: 97
Registriert: 27.01.2013 14:43

Zeilen txt löschen

Beitrag 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?
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Zeilen txt löschen

Beitrag 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
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Zeilen txt löschen

Beitrag 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$
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Fanpost
Beiträge: 97
Registriert: 27.01.2013 14:43

Re: Zeilen txt löschen

Beitrag von Fanpost »

Danke. Da ich aber die Weisheit nicht mit Löffeln gefressen habe, brauche ich halt ein Code-Schnippsel
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Zeilen txt löschen

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Zeilen txt löschen

Beitrag 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.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Zeilen txt löschen

Beitrag 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 :)
Zuletzt geändert von Josh am 30.08.2017 21:05, insgesamt 1-mal geändert.
Benutzeravatar
GlassJoe
Beiträge: 108
Registriert: 11.06.2017 20:25
Computerausstattung: 2 x AMD Phenom II x4 945,2x Dell Latitude X300, Dell Latitude D410, Hp Compaq NC4400

Re: Zeilen txt löschen

Beitrag 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
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Fanpost
Beiträge: 97
Registriert: 27.01.2013 14:43

Re: Zeilen txt löschen

Beitrag von Fanpost »

@ GlassJoe

Danke. Ich muss leider mit der "Quell-Datei" arbeiten
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Zeilen txt löschen

Beitrag 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?
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Antworten