Zeilen in Datei löschen Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Zeilen in Datei löschen

06 Feb 2024, 22:31

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
gero
Posts: 171
Joined: 02 Oct 2013, 05:36

Re: Zeilen in Datei löschen  Topic is solved

07 Feb 2024, 04:22

Du musst die Datei einlesen und dann neu aufbauen.

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
edit // ... geht imho auch mit s.Hilfe: "Loop, Read, Eingabedatei , Ausgabedatei" ... k.A. was schneller / besser ist.
just me
Posts: 9464
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zeilen in Datei löschen

07 Feb 2024, 08:23

Wie @gero schon sagte.

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
   }
}
Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Re: Zeilen in Datei löschen

07 Feb 2024, 09:31

@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
just me
Posts: 9464
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zeilen in Datei löschen

08 Feb 2024, 11:42

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:

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 := ""
Den 'Dateirest' kannst Du nun zurückschreiben und fertig.
gero
Posts: 171
Joined: 02 Oct 2013, 05:36

Re: Zeilen in Datei löschen

08 Feb 2024, 13:55

... ginge auch als looploser Old-School-Zweizeiler ... schon interessant wie viele Wege AHK so bietet.

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
gruss
gero

edit // ... gibt bestimmt auch noch einen netten RegEx-Einzeiler ... ;)
just me
Posts: 9464
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zeilen in Datei löschen

09 Feb 2024, 03:24

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 ersten 3 Zeilen löschen, unabhängig davon, was oder ob da was steht?
gero
Posts: 171
Joined: 02 Oct 2013, 05:36

Re: Zeilen in Datei löschen

09 Feb 2024, 04:42

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
garry
Posts: 3770
Joined: 22 Dec 2013, 12:50

Re: Zeilen in Datei löschen

09 Feb 2024, 05:06

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

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))
}
;====================================================
User avatar
flyingDman
Posts: 2817
Joined: 29 Sep 2013, 19:01

Re: Zeilen in Datei löschen

09 Feb 2024, 13:46

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
garry
Posts: 3770
Joined: 22 Dec 2013, 12:50

Re: Zeilen in Datei löschen

09 Feb 2024, 14:51

gero:
... gibt bestimmt auch noch einen netten RegEx-Einzeiler ... ;)
ja, hier von flyingDman ... danke . Habe RegEx immer noch nicht gelernt ...
User avatar
flyingDman
Posts: 2817
Joined: 29 Sep 2013, 19:01

Re: Zeilen in Datei löschen

09 Feb 2024, 15:54

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
gero
Posts: 171
Joined: 02 Oct 2013, 05:36

Re: Zeilen in Datei löschen

09 Feb 2024, 16:05

@flyingDman
... wie heissen diese kleinen Ortschaften in unserem Nachbarland ... richtig ! ... böhmische Dörfer ... :D
wenn-dann-sonst >>> Klasse :thumbup:

gruss
gero
garry
Posts: 3770
Joined: 22 Dec 2013, 12:50

Re: Zeilen in Datei löschen

09 Feb 2024, 16:20

@flyingDman danke
Zeros_Binary_Imgur.gif
Zeros_Binary_Imgur.gif (37.06 KiB) Viewed 587 times

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 106 guests