Zeilen in Datei löschen Topic is solved
Moderator: jNizM
-
- Posts: 135
- Joined: 28 Jan 2021, 17:09
- Location: Germany
Zeilen in Datei löschen
Moin!
Wie kann ich in einer c:\Muster.txt die ersten 3 Zeilen löschen, unabhängig davon, was oder ob da was steht?
Es geht also nicht um eine Suchen/Ersetzen-Funktion.
Stroker-007
Wie kann ich in einer c:\Muster.txt die ersten 3 Zeilen löschen, unabhängig davon, was oder ob da was steht?
Es geht also nicht um eine Suchen/Ersetzen-Funktion.
Stroker-007
Re: Zeilen in Datei löschen Topic is solved
Du musst die Datei einlesen und dann neu aufbauen.
gruss
gero
edit // ... geht imho auch mit s.Hilfe: "Loop, Read, Eingabedatei , Ausgabedatei" ... k.A. was schneller / besser ist.
gruss
gero
Code: Select all
FileRead, FILE, C:\Muster.txt
FileDelete, C:\Muster.txt
Loop,parse,FILE,`n,`r
{
IF (A_Index > 3)
NEU .= A_LoopField . "`n"
}
FileAppend,% NEU , C:\Muster.txt
exitapp
Re: Zeilen in Datei löschen
Wie @gero schon sagte.
Mit dem File-Objekt bietet sich noch der folgende Weg:
Mit dem File-Objekt bietet sich noch der folgende Weg:
Code: Select all
; 1
; 2
; 3
; 4
; 5
; 6
#Requires AutoHotkey v1.1
RemoveLeadingLines(A_ScriptFullPath, 3)
ExitApp
RemoveLeadingLines(File, NumOfLines) {
If (FileObj := FileOpen(File, "rw")) { ; Datei zum lesen ud Schreiben öffnen
FilePos := FileObj.Pos ; aktuellen Dateizeiger merken (BOM?)
Loop, %NumOfLines% ; für die gewünschte Anzehl zeilen wiederholen
FileObj.ReadLine() ; eine Zeile lesen
Until FileObj.AtEOF ; abbrechen, falls das Dateiende erreicht ist
If FileObj.AtEOF { ; wenn das Dateiende erreicht ist
FileObj.Pos := FilePos ; Dateizeiger auf Anfang setzen
FileObj.Length := FilePos ; Dateilänge korrigieren
}
Else { ; wenn nicht
RestLen := FileObj.Length - FilePos ; Restlänge bestimmen
FileObj.RawRead(Remainder, RestLen) ; restliche Datei binär einlesen
FileObj.Pos := FilePos ; Dateizeiger auf Anfang setzen
FileObj.RawWrite(Remainder, RestLen) ; restliche Datei binär zurückschreiben
FileObj.Length := FileObj.Pos ; Dateilänge korrigieren
}
FileObj.Close() ; Datei schließen
}
}
-
- Posts: 135
- Joined: 28 Jan 2021, 17:09
- Location: Germany
Re: Zeilen in Datei löschen
@gero,
das Prinzip "Datei einlesen - ändern - wieder rausschreiben" ist mir zwar bekannt und wende ich öfters zus. mit fileappend an, aber das dazwischen mit dem parsen... Habe etwas gebraucht, bis ich es verstanden habe, weil in der Doku unter "Variablen und Ausdrücke" ganz unten bei "A_LoopField" nichts erklärt, sondern lediglich auf "Siehe parsende Schleife" verwiesen wird. Dort wird das auch nicht erklärt, aber anhand von Beispiel #1 hab ich´s dann gecheckt. Wär ich "freiwillig" nicht draufgekommen.
Danke, hab ich wieder was Nützliches gelernt!
@just me,
das ist sicher Spitzenklasse, aber im Moment noch viel zu hoch für mich. Wenn ich dem jetzt nachgehe, dann verliere ich mein eigentliches Projekt aus den Augen. Und soviel Zeit hab ich jetzt auch wieder nicht...
Stroker-007
das Prinzip "Datei einlesen - ändern - wieder rausschreiben" ist mir zwar bekannt und wende ich öfters zus. mit fileappend an, aber das dazwischen mit dem parsen... Habe etwas gebraucht, bis ich es verstanden habe, weil in der Doku unter "Variablen und Ausdrücke" ganz unten bei "A_LoopField" nichts erklärt, sondern lediglich auf "Siehe parsende Schleife" verwiesen wird. Dort wird das auch nicht erklärt, aber anhand von Beispiel #1 hab ich´s dann gecheckt. Wär ich "freiwillig" nicht draufgekommen.
Danke, hab ich wieder was Nützliches gelernt!
@just me,
das ist sicher Spitzenklasse, aber im Moment noch viel zu hoch für mich. Wenn ich dem jetzt nachgehe, dann verliere ich mein eigentliches Projekt aus den Augen. Und soviel Zeit hab ich jetzt auch wieder nicht...
Stroker-007
Re: Zeilen in Datei löschen
Moin @Stroker-007,
ganz so komplex, wie es auf den ersten Blick auschauen mag, ist das File-Objekt nicht. Sei's drum, alle Wege führen nach Rom.
Wenn Du die Datei einliest, ist es nicht erforderlich, den kompletten Inhalt mit Loop, Parse durchzuarbeiten. Zeilenwechsel in Windows-Textdateien bestehen normalerweise aus zwei Zeichen: `r`n. Wenn man will, kann man auch auf das `r verzichten. Einige Editoren kommen auch ohne zurecht. In jedem Fall ist das letzte Zeichen einer Zeile, auf die noch etwas folgt, ein `n.
Wenn Du nun die ersten 3 Zeilen löschen willst, kannst Du einfach nach dem dritten `n suchen. Das geht mit InStr(), dem man eine Startposition für die Suche mitgeben kann. Für 3 Zeilen würde das so aussehen:
Den 'Dateirest' kannst Du nun zurückschreiben und fertig.
ganz so komplex, wie es auf den ersten Blick auschauen mag, ist das File-Objekt nicht. Sei's drum, alle Wege führen nach Rom.
Wenn Du die Datei einliest, ist es nicht erforderlich, den kompletten Inhalt mit Loop, Parse durchzuarbeiten. Zeilenwechsel in Windows-Textdateien bestehen normalerweise aus zwei Zeichen: `r`n. Wenn man will, kann man auch auf das `r verzichten. Einige Editoren kommen auch ohne zurecht. In jedem Fall ist das letzte Zeichen einer Zeile, auf die noch etwas folgt, ein `n.
Wenn Du nun die ersten 3 Zeilen löschen willst, kannst Du einfach nach dem dritten `n suchen. Das geht mit InStr(), dem man eine Startposition für die Suche mitgeben kann. Für 3 Zeilen würde das so aussehen:
Code: Select all
Zeilen := 3
DateiEnde := StrLen(DateiInhalt)
ZeilenEnde := 0
Loop, %Zeilen% {
If !(ZeilenEnde := InStr(DateiInhalt, "`n", 1, ZeilenEnde + 1)) { ; es wurde kein (weiterer) Zeilenwechsel gefunden) -> Dateiende erreicht
ZeilenEnde := DateiEnde
Break
}
}
If (ZeilenEnde < DateiEnde)
DateiRest := SubStr(DateiInhalt, ZeilenEnde + 1)
Else
DateiRest := ""
Re: Zeilen in Datei löschen
... ginge auch als looploser Old-School-Zweizeiler ... schon interessant wie viele Wege AHK so bietet.
gruss
gero
edit // ... gibt bestimmt auch noch einen netten RegEx-Einzeiler ...
Code: Select all
STRING =
(
Zeile 1
Zeile 2
Zeile 3
Zeile 4
Zeile 5
Zeile 6
Zeile 7
Zeile 8
)
MsgBox,4096,Info,% STRING
StringGetPos,POS,STRING,`n,L3
StringTrimLeft,STRING,STRING,% POS + 1
MsgBox,4096,Info,% STRING
gero
edit // ... gibt bestimmt auch noch einen netten RegEx-Einzeiler ...
Re: Zeilen in Datei löschen
Moin @gero,
die Schleife deckt nur den Sonderfall ab, dass es weniger als 4 Zeilen sind. Dann findet Dein StringGetPos kein drittes `n. Dafür müsstest du noch eine Anpassung vornehmen.
die Schleife deckt nur den Sonderfall ab, dass es weniger als 4 Zeilen sind. Dann findet Dein StringGetPos kein drittes `n. Dafür müsstest du noch eine Anpassung vornehmen.
... die ersten 3 Zeilen löschen, unabhängig davon, was oder ob da was steht?
Re: Zeilen in Datei löschen
Schon klar, ich weiss was du meinst ... nur hab ich die Frage halt so verstanden:
Entferne die ersten 3 Zeilen (von einem Text mit mehr als 3 Zeilen) , egal was diese 3 Zeilen beinhalten.
gruss
gero
Entferne die ersten 3 Zeilen (von einem Text mit mehr als 3 Zeilen) , egal was diese 3 Zeilen beinhalten.
gruss
gero
Re: Zeilen in Datei löschen
danke für die Bespiele und auch die guten Erklärungen zum 'FileObj'
meine Textdateien beinhalten meistens `r`n
evtl ein msgbox falls Zeilen nicht enfernt wurden wenn pos<1
Beispiel noch mit LASTLINES
meine Textdateien beinhalten meistens `r`n
evtl ein msgbox falls Zeilen nicht enfernt wurden wenn pos<1
Beispiel noch mit LASTLINES
Code: Select all
I:=3
STRING =
(Ltrim join`r`n C
Zeile 1
Zeile 2 ;- comment-2
Zeile 3
Zeile 4
Zeile 5 ;- comment-5
Zeile 6
Zeile 7
Zeile 8
)
msgbox, 262208,ORIGINAL-STRING,%STRING%
StringGetPos,POS,STRING,`r`n,L%i%
if (pos<1)
{
msgbox, 262208,ERROR,POS is <1 `nNichts geändert im string
exitapp
}
StringTrimLeft,STRING,STRING,% POS + 1
msgbox, 262208,REMOVED,%i% lines removed=`n%STRING%
;-
;------ show last %I% lines --------------------------
lines := LastLines(string,I)
msgbox, 262208,LAST-LINES ,Last %i% Lines=`n%lines%
exitapp
;-----------------------------------------------------
LastLines(ByRef string, linecount, delimiter := "`n") {
return SubStr(string, InStr(string, delimiter,, 0, linecount) + StrLen(delimiter))
}
;====================================================
- flyingDman
- Posts: 2828
- Joined: 29 Sep 2013, 19:01
Re: Zeilen in Datei löschen
Vielleicht:
Code: Select all
I := 3
H := "Line_1`r`nLine_2`r`nLine_3`r`nLine_4`r`nLine_5`r`nLine_6`r`nLine_7`r`nLine_8`r`nLine_9"
msgbox % regexreplace(H,"`a).*\R?",,,I)
14.3 & 1.3.7
Re: Zeilen in Datei löschen
gero:
ja, hier von flyingDman ... danke . Habe RegEx immer noch nicht gelernt ...... gibt bestimmt auch noch einen netten RegEx-Einzeiler ...
- flyingDman
- Posts: 2828
- Joined: 29 Sep 2013, 19:01
Re: Zeilen in Datei löschen
Ohne Regex:
Code: Select all
I := 3
H := "Line_1`r`nLine_2`r`nLine_3`r`nLine_4`r`nLine_5`r`nLine_6`r`nLine_7`r`nLine_8`r`nLine_9"
msgbox % (J := InStr(H,"`n",,1,I)) ? substr(H, J + 1) : ""
14.3 & 1.3.7
Re: Zeilen in Datei löschen
@flyingDman
... wie heissen diese kleinen Ortschaften in unserem Nachbarland ... richtig ! ... böhmische Dörfer ...
wenn-dann-sonst >>> Klasse
gruss
gero
... wie heissen diese kleinen Ortschaften in unserem Nachbarland ... richtig ! ... böhmische Dörfer ...
wenn-dann-sonst >>> Klasse
gruss
gero