Zeilen txt löschen
Zeilen txt löschen
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
Mit
sollte das gehen.
Beispiel:
Code: Alles auswählen
TruncateFile(#Datei)
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
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$
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Zeilen txt löschen
Danke. Da ich aber die Weisheit nicht mit Löffeln gefressen habe, brauche ich halt ein Code-Schnippsel
Re: Zeilen txt löschen
Warum Blockweise? Datei komplett in einen Buffer laden und von hinten zu suchen beginnen.mk-soft hat geschrieben:Alternative die Datei Blockweise von hinten in ein Buffer laden und selber nach den Zeilenumbruch suchen
Auf jeden Fall über Pointer arbeiten, bei Stringoperationen ist die Zigarettenpause sonst schon mitprogrammiert.
- 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
Je nachdem wie groß die Datei ist, fände ich es Blockweise auch nicht schlecht.Josh hat geschrieben:Warum Blockweise? Datei komplett in einen Buffer laden und von hinten zu suchen beginnen.mk-soft hat geschrieben:Alternative die Datei Blockweise von hinten in ein Buffer laden und selber nach den Zeilenumbruch suchen
Re: Zeilen txt löschen
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 istNicTheQuick hat geschrieben:Je nachdem wie groß die Datei ist, fände ich es Blockweise auch nicht schlecht.

Zuletzt geändert von Josh am 30.08.2017 21:05, insgesamt 1-mal geändert.
- 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
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.
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̡̡̡̡.___٩(- ̮̮̃-̃)۶
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Re: Zeilen txt löschen
@ GlassJoe
Danke. Ich muss leider mit der "Quell-Datei" arbeiten
Danke. Ich muss leider mit der "Quell-Datei" arbeiten
Re: Zeilen txt löschen
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: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
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.
Zum testen aber eine Kopie machen und mit der arbeiten:)Fanpost hat geschrieben:@ GlassJoe
Danke. Ich muss leider mit der "Quell-Datei" arbeiten
Darf man fragen, was zur Hölle du da eigentlich löschen willst?
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!