Loop Read

Ruft die Zeilen einer Textdatei nacheinander ab.

Loop Read EingabeDatei , AusgabeDatei

Parameter

EingabeDatei

Typ: Zeichenkette

Name der Textdatei, die von der Schleife gelesen werden soll. Wenn kein absoluter Pfad angegeben ist, wird die Datei im A_WorkingDir-Verzeichnis vermutet. Die Zeilen einer Datei können entweder mit einem CR-LF-Paar (`r`n), nur mit einem LF-Zeichen (`n) oder nur mit einem CR-Zeichen (`r) enden.

AusgabeDatei

Typ: Zeichenkette

(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 kann die FileAppend-Funktion ohne den DateiName-Parameter verwendet werden, 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, ein LF-Zeichen (`n) oder ein CR-LF-Paar (`r`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 FileAppend aufruft.

Optionen: Der Modus der Zeilenumbruchübersetzung und die Kodierung der Ausgabedatei hängen von den Optionen ab, die zu Beginn an FileAppend übergeben wurden (d.h. der erste Aufruf ohne DateiName). Nachfolgende Aufrufe ignorieren den Optionen-Parameter. Standardmäßig erfolgt keine Zeilenumbruchübersetzung, d.h. LF-Zeichen (`n) werden unverändert geschrieben, es sei denn, die "`n"-Option ist vorhanden.

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) 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.

Bemerkungen

Eine dateilesende Schleife ist nützlich, wenn alle Zeilen in einer Textdatei nacheinander abgearbeitet werden sollen. Die Datei bleibt die ganze Zeit geöffnet, damit sie nicht für jede neue Zeile neu eingelesen werden muss.

Die interne Variable A_LoopReadLine ist nur in einer dateilesenden Schleife von Bedeutung. Sie enthält den Inhalt der aktuellen Zeile ohne das CR-LF-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 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.

Der One True Brace (OTB) Style wird unterstützt, d.h. Sie können je nach Bedarf die geschweifte Startklammer am Zeilenende positionieren. Zum Beispiel: Loop Read EingabeDatei, AusgabeDatei {.

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.

Nach der Schleife kann optional eine Else-Anweisung angegeben werden, die ausgeführt wird, wenn die Eingabedatei leer ist oder nicht gefunden werden konnte. Wenn AusgabeDatei angegeben wurde, kann der oben beschriebene spezielle Modus von FileAppend auch im Körper der Else-Anweisung verwendet werden. Ohne Else wird ein OSError ausgelöst, wenn die Datei nicht gefunden werden konnte.

FileEncoding, FileOpen/File-Objekt, FileRead, 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")
}
else
    MsgBox "Adressliste.txt war komplett leer oder wurde nicht gefunden."

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.

QuelleDatei := FileSelect(3,, "Wähle 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)
{
    Ergebnis := MsgBox("Existierende Datei überschreiben? Drücken Sie Nein, um die Links anzufügen.`n`nDATEI: " ZielDatei,, 4)
    if Ergebnis = "Yes"
        FileDelete ZielDatei
}

LinksAnzahl := 0
Loop read, QuelleDatei, ZielDatei
{
    URLSuche(A_LoopReadLine)
}
MsgBox LinksAnzahl ' Links wurden gefunden und in "' ZielDatei '" geschrieben.'
return


URLSuche(URLSuchZkette)
{
    ; Das wird so gemacht, weil einige URLs andere URLs eingebettet haben:
    ; Die Startposition ganz links finden:
    URLStart := 0  ; Standardwert setzen.
    for URLPräfix in ["https://", "http://", "ftp://", "www."]
    {
        DiesePos := InStr(URLSuchZkette, URLPräfix)
        if !DiesePos  ; Dieses Präfix ist disqualifiziert.
            continue
        if !URLStart
            URLStart := DiesePos
        else ; URLStart enthält gültige Position, also mit DiesePos vergleichen.
        {
            if DiesePos && DiesePos < URLStart
                URLStart := DiesePos
        }
    }

    if !URLStart  ; Keine URLs in URLSuchZkette.
        return

    ; Andernfalls diese URL extrahieren:
    URL := SubStr(URLSuchZkette, URLStart)  ; Beginnenden/unwichtigen Teil auslassen.
    Loop parse, URL, " `t<>"  ; 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"
    global LinksAnzahl += 1

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