Zeilen in Datei löschen

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Zeilen in Datei löschen

Re: Zeilen in Datei löschen

by garry » 09 Feb 2024, 16:20

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

Re: Zeilen in Datei löschen

by gero » 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

Re: Zeilen in Datei löschen

by flyingDman » 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) : ""

Re: Zeilen in Datei löschen

by garry » 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 ...

Re: Zeilen in Datei löschen

by flyingDman » 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)

Re: Zeilen in Datei löschen

by garry » 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))
}
;====================================================

Re: Zeilen in Datei löschen

by gero » 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

Re: Zeilen in Datei löschen

by just me » 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?

Re: Zeilen in Datei löschen

by gero » 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 ... ;)

Re: Zeilen in Datei löschen

by just me » 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.

Re: Zeilen in Datei löschen

by Stroker-007 » 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

Re: Zeilen in Datei löschen

by just me » 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
   }
}

Re: Zeilen in Datei löschen

by gero » 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.

Zeilen in Datei löschen

by Stroker-007 » 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

Top