Loop (Dateiinhalt lesen)

Ruft die Zeilen einer Textdatei nacheinander ab (performanter als FileReadLine).

Loop, Read, EingabeDatei , AusgabeDatei

Parameter

Read

Dieser Parameter muss das Wort READ sein.

EingabeDatei

Name der Textdatei, die von der Schleife gelesen werden soll. Wenn kein absoluter Pfad angegeben ist, wird die Datei im A_WorkingDir-Verzeichnis vermutet. Windows- und Unix-Formate werden unterstützt, d.h. die Zeilen der Datei können entweder mit einem Wagenrücklauf-Zeilenvorschub-Paar (`r`n) oder nur mit einem Zeilenvorschub (`n) enden.

AusgabeDatei

(Optional) Name der Datei, die während der Schleifenausführung geöffnet bleibt. Wenn kein absoluter Pfad angegeben ist, wird die Datei im A_WorkingDir-Verzeichnis vermutet.

Innerhalb der Schleife benötigt der FileAppend-Befehl nur einen Parameter, um den zu schreibenden Text an die spezielle Datei anzufügen. Diese Art des Anfügens ist performanter als FileAppend im 2-Parameter-Modus, da die Datei nicht bei jeder Operation geschlossen und wieder geöffnet werden muss. Achten Sie darauf, einen Zeilenvorschub (`n) nach dem Text einzufügen, falls notwendig.

Die Datei wird nicht geöffnet, wenn nie etwas in sie geschrieben wird. Dies ist der Fall, wenn die Schleife null Wiederholungen hat oder nie den FileAppend-Befehl verwendet.

Zeilenumbruchübersetzung: Um die Zeilenumbruchübersetzung zu deaktivieren, setzen Sie ein Sternchen vor den Dateinamen. Dies hat zur Folge, dass jeder Zeilenumbruch als einzelner Zeilenvorschub (`n) statt wie unter Windows üblich als Wagenrücklauf-Zeilenvorschub-Paar (`r`n) geschrieben wird. Zum Beispiel: *C:\Meine Unix-Datei.txt. Selbst wenn das Sternchen nicht angegeben ist - die Zeilenumbruchübersetzung wird automatisch deaktiviert, sobald ein FileAppend in der Schleife ein Wagenrücklauf-Zeilenvorschub-Paar (`r`n) schreibt.

Standardausgabe (stdout): Geben Sie ein Sternchen (*) für AusgabeDatei an, um einen via FileAppend geschriebenen Text zur Standardausgabe (stdout) zu senden. Diese Art von Text kann auf eine Datei umgeleitet, an eine EXE-Datei weitergeleitet oder von umfangreichen Texteditoren abgefangen werden. Allerdings wird ein zur Standardausgabe gesendeter Text nicht in der Eingabeaufforderung angezeigt, von der aus die Zeile gestartet wurde. Dies kann umgangen werden, indem 1) [v1.1.33+] das Skript mit der Ahk2Exe-ConsoleApp-Direktive kompiliert wird, oder 2) die Ausgabe des Skripts via Piping an einen anderen Befehl oder an ein anderes Programm weitergeleitet wird. Weitere Informationen finden Sie unter FileAppend.

Escapezeichenversehene Kommas: Im Gegensatz zum letzten Parameter der meisten anderen Befehle müssen Kommas in AusgabeDatei mit einem Escapezeichen versehen werden (`,).

Bemerkungen

Eine dateilesende Schleife ist nützlich, wenn alle Zeilen in einer Textdatei nacheinander abgearbeitet werden sollen. Diese Schleife ist performanter als FileReadLine, weil: 1) die Datei während der gesamten Operation geöffnet bleibt; und 2) die Datei nicht jedes Mal neu eingelesen werden muss, um die gewünschte Zeilennummer zu finden.

Die interne Variable A_LoopReadLine ist nur in einer dateilesenden Schleife von Bedeutung. Sie enthält den Inhalt der aktuellen Zeile ohne das Wagenrücklauf-Zeilenvorschub-Paar (`r`n) am Ende. Wenn eine innere dateilesende Schleife von einer äußeren dateilesenden Schleife umschlossen ist, hat die Dateizeile der innersten Schleife Vorrang.

Es können Zeilen mit einer Länge von bis zu 65534 Zeichen gelesen werden. Wenn eine Zeile diese Länge überschreitet, werden die restlichen Zeichen bei der nächsten Schleifenwiederholung gelesen.

In einer dateilesenden Schleife wird oft StrSplit(), StringSplit oder eine parsende Schleife verwendet, um den Inhalt von jeder gefundenen Zeile in EingabeDatei zu parsen. Wenn z.B. jede Zeile in EingabeDatei eine Reihe von tabgetrennten Feldern ist, können solche Felder einzeln wie folgt abgerufen werden:

Loop, read, C:\Datenbank-Export.txt
{
    Loop, parse, A_LoopReadLine, %A_Tab%
    {
        MsgBox, Feld Nr. %A_Index% ist %A_LoopField%.
    }
}

Um eine komplette Datei in eine Variable zu laden, verwenden Sie FileRead, weil es deutlich performanter ist als eine Schleife (insbesondere bei großen Dateien).

Um mehrere Dateien simultan zu lesen oder zu schreiben, verwenden Sie FileOpen().

Auf der Loop-Seite finden Sie Informationen zu Blöcken, Break, Continue und A_Index (die in jeder Schleifenvariante verwendet werden kann).

Mit FileEncoding können Sie kontrollieren, wie eine Datei ohne Byte-Order-Markierung dekodiert werden soll.

FileEncoding, FileOpen()/File-Objekt, FileRead, FileReadLine, FileAppend, Sort, Loop, Break, Continue, Blöcke, FileSetAttrib, FileSetTime

Beispiele

Prüft nacheinander alle Zeilen in der ersten Datei, ob sie das Wort FAMILIE enthalten. Ist dies der Fall, wird die jeweilige Zeile in die zweite Datei geschrieben. Entkommentieren Sie die erste Zeile, um die zweite Datei zu überschreiben, anstatt ihr Text anzufügen.

;FileDelete, C:\Dokumente\Familienadressen.txt

Loop, read, C:\Dokumente\Adressliste.txt, C:\Dokumente\Familienadressen.txt
{
    if InStr(A_LoopReadLine, "Familie")
        FileAppend, %A_LoopReadLine%`n
}

Ruft die letzte Zeile einer Textdatei ab.

Loop, read, C:\Logdatei.txt
    letzteZeile := A_LoopReadLine  ; Enthält nach Schleifenende die letzte Zeile.

Versucht, alle FTP- und HTTP-URLs aus einer Text- oder HTML-Datei zu extrahieren.

FileSelectFile, QuelleDatei, 3,, Wählen Sie eine Text- oder HTML-Datei zur Analyse aus:
if (QuelleDatei = "")
    return  ; Beendet das Skript in diesem Fall.

SplitPath, QuelleDatei,, QuelleDateiPfad,, QuelleDateiOhneEnd
ZielDatei := QuelleDateiPfad "\" QuelleDateiOhneEnd " Extrahierte Links.txt"

if FileExist(ZielDatei)
{
    MsgBox, 4,, Existierende Datei überschreiben? Drücken Sie Nein, um die Links anzufügen.`n`nDATEI: %ZielDatei%
    IfMsgBox, Yes
        FileDelete, %ZielDatei%
}

LinksAnzahl := 0
Loop, read, %QuelleDatei%, %ZielDatei%
{
    URLSuchZkette := A_LoopReadLine
    Gosub, URLSuche
}
MsgBox %LinksAnzahl% Links wurden gefunden und in "%ZielDatei%" geschrieben.
return


URLSuche:
; Das wird so gemacht, weil einige URLs andere URLs eingebettet haben:
URLStart1 := InStr(URLSuchZkette, "https://")
URLStart2 := InStr(URLSuchZkette, "http://")
URLStart3 := InStr(URLSuchZkette, "ftp://")
URLStart4 := InStr(URLSuchZkette, "www.")

; Die Startposition ganz links finden:
URLStart := URLStart1  ; Standardwert setzen.
Loop
{
    ; Es hilft der Performanz (zumindest in einem Skript mit vielen Variablen),
    ; "URLStart%A_Index%" nur einmal aufzulösen:
    ArrayElement := URLStart%A_Index%
    if (ArrayElement = "")  ; Ende des Pseudo-Arrays erreicht.
        break
    if (ArrayElement = 0)  ; Dieses Element ist disqualifiziert.
        continue
    if (URLStart = 0)
        URLStart := ArrayElement
    else ; URLStart enthält gültige Position, also mit ArrayElement vergleichen.
    {
        if (ArrayElement != 0)
            if (ArrayElement < URLStart)
                URLStart := ArrayElement
    }
}

if (URLStart = 0)  ; Keine URLs in URLSuchZkette.
    return

; Andernfalls diese URL extrahieren:
URL := SubStr(URLSuchZkette, URLStart)  ; Beginnenden/unwichtigen Teil auslassen.
Loop, parse, URL, %A_Tab%%A_Space%<>  ; Erstes Leer-, Tab- oder Winkelzeichen finden (falls verfügbar).
{
    URL := A_LoopField
    break  ; d.h. Schleife nur 1x wiederholen, um das erste "Feld" abzurufen.
}
; Wenn die obige Schleife wegen fehlender Endungszeichen null Wiederholungen
; hatte, den Inhalt der URL-Variable unverändert lassen.

; Wenn URL mit einem doppelten Anführungszeichen endet, dieses entfernen.
; Vorerst wird StrReplace verwendet, aber beachte, dass Anführungszeichen
; in URLs scheinbar legitim sind und dadurch beschädigt werden könnten:
BereinigteURL := StrReplace(URL, "`"")
FileAppend, %BereinigteURL%`n
LinksAnzahl += 1

; Prüfen, ob weitere URLs in dieser Zeile vorkommen:
ZuEntfernendeZeichen := StrLen(URL)
ZuEntfernendeZeichen += URLStart
URLSuchZkette := SubStr(URLSuchZkette, ZuEntfernendeZeichen)
Gosub, URLSuche  ; Rekursiver Aufruf von sich selbst.
return