Loop (Dateiinhalt lesen)

Ruft die Zeilen einer Textdatei einzeln ab (leistungsfähiger 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; das heißt, dass die Zeilen einer Datei entweder mit einem CR-LF-Paar (`r`n) oder LF-Zeichen (`n) enden können.

AusgabeDatei

(Optional) Name der Datei, die während des Schleifenvorgangs offen bleibt. Wenn kein absoluter Pfad angegeben ist, wird die Datei im A_WorkingDir-Verzeichnis vermutet.

Innerhalb der Schleife braucht der FileAppend-Befehl nur einen Parameter, um den zu schreibenden Text an die spezielle Datei anzufügen. Diese Art von Anfügen ist leistungsfähiger als FileAppend im 2-Parameter-Modus, weil es verhindert, dass die Datei bei jeder Operation geschlossen und neu geöffnet wird. Achten Sie darauf, ein LF-Zeichen (`n) nach dem Text einzufügen, falls notwendig.

Die Datei wird nie geöffnet, wenn nichts zu schreiben ist. Zum Beispiel wenn die Schleife nie durchlaufen wird oder nie den FileAppend-Befehl verwendet.

End-of-Line-Übersetzung (EOL): Um die EOL-Konvertierung zu deaktivieren, setzen Sie ein Sternchen vor dem Dateinamen. Dieser Modus schreibt jedes Zeilenumbruchszeichen (`n) als einzelnes LF-Zeichen (LF) statt wie üblich als CR+LF. Zum Beispiel: *C:\Meine Unix-Datei.txt. Selbst wenn das Sternchen nicht angegeben ist - die EOL-Übersetzung wird automatisch deaktiviert, wenn das erste in der Schleife vorkommende FileAppend ein CR-LF-Paar (`r`n) schreibt.

Standardausgabe (stdout): Ein Sternchen (*) im Parameter AusgabeDatei bewirkt, dass ein von FileAppend geschriebener Text zur Standardausgabe (stdout) gesendet wird. Diese Art von Text kann auf eine Datei umgeleitet, an eine EXE-Datei weitergeleitet oder von originellen Texteditoren abgefangen werden. Allerdings wird ein zur Standardausgabe gesendeter Text nicht in der Eingabeaufforderung angezeigt, von wo aus die Zeile gestartet wurde. Dies kann umgangen werden, indem 1) [v1.1.33+] das Skript mit der Ahk2Exe-ConsoleApp-Direktive kompiliert, oder 2) die Ausgabe des Skripts via Piping an einen anderen Befehl oder an ein anderes Programm weitergeleitet wird. Siehe FileAppend für mehr Details.

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

Bemerkungen

Eine Datei-lesende Schleife ist nützlich, wenn Sie alle Zeilen in einer Textdatei einzeln abarbeiten wollen. Diese Schleife ist leistungsfähiger als FileReadLine, weil: 1) die Datei bei der Operation die ganze Zeit offen bleiben kann; 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 Datei-lesenden Schleife von Bedeutung. Sie enthält den Inhalt der aktuellen Zeile ohne das CR-LF-Paar (`r`n) am Ende. Wenn eine innere Datei-lesende Schleife von einer äußeren Datei-lesenden Schleife umschlossen ist, wird die Zeile von der innersten Schleife Vorrang haben.

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 während des nächsten Schleifendurchlaufs gelesen.

In einer Datei-lesenden Schleife wird oft StrSplit(), StringSplit oder eine parsende Schleife verwendet, um den Inhalt von jeder Zeile zu parsen, die in EingabeDatei gefunden wurde. Wenn jede Zeile in EingabeDatei beispielsweise aus mehreren tab-getrennten Feldern besteht, können solche Felder wie folgt einzeln abgerufen werden:

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

Um eine komplette Datei in eine Variable zu laden, verwendet Sie FileRead, weil es deutlich leistungsfähiger als eine Schleife ist (besonders 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 (sie können in jeder Schleifenvariante verwendet werden).

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

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

Beispiele

Zeilen, die in der ersten Datei das Wort FAMILIE enthalten, werden in die zweite Datei geschrieben. Heben Sie die Kommentierung der ersten Zeile auf, um die vorhandene Datei zu überschreiben statt Text anzufügen.

;FileDelete, C:\Dokumente\Familie-Adressen.txt

Loop, read, C:\Dokumente\Adressenliste.txt, C:\Dokumente\Familie-Adressen.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  ; Sobald die Schleife endet, wird diese Variable die letzte Zeile beinhalten.

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 zum Analysieren aus:
if (QuelleDatei = "")
    return  ; In diesem Fall beenden.

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

if FileExist(ZielDatei)
{
    MsgBox, 4,, Vorhandene Datei überschreiben? Drücken Sie Nein, um die Links nur 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 auf diese Weise gemacht, weil einige URLs andere URLs eingebettet haben:
URLStart1 := InStr(URLSuchZkette, "https://")
URLStart2 := InStr(URLSuchZkette, "http://")
URLStart3 := InStr(URLSuchZkette, "ftp://")
URLStart4 := InStr(URLSuchZkette, "www.")

; Findet die Startposition ganz links:
URLStart := URLStart1  ; Setzt den Standardwert.
Loop
{
    ; Es kommt der Leistung zugute (zumindest in einem Skript mit vielen Variablen), wenn
    ; "URLStart%A_Index%" nur einmal aufgelöst wird:
    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 beinhaltet eine gültige Position, also mit ArrayElement vergleichen.
    {
        if (ArrayElement != 0)
            if (ArrayElement < URLStart)
                URLStart := ArrayElement
    }
}

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

; Extrahiert ansonsten diese URL:
URL := SubStr(URLSuchZkette, URLStart)  ; Entfernt den beginnenden/irrelevanten Teil.
Loop, parse, URL, %A_Tab%%A_Space%<>  ; Findet das erste Leer-, Tab- oder Winkelzeichen (falls vorhanden).
{
    URL := A_LoopField
    break  ; Führt nur eine Schleifeniteration durch, um das erste "Feld" zu holen.
}
; Wenn die obige Schleife aufgrund eines nicht-vorhandenen Endungszeichen keine Iteration hat,
; bleibt der Inhalt der URL-Variable unberührt.

; Wenn die URL mit einem Anführungszeichen endet, wird sie entfernt.  Vorerst wird StringReplace verwendet, aber
; beachten Sie, dass Anführungszeichen in URLs legitim sind, so dass sie dadurch
; beschädigt werden könnten:
StringReplace, SaubereURL, URL, ",, All
FileAppend, %SaubereURL%`n
LinksAnzahl += 1

; Schaut nach, ob noch andere URLs in dieser Zeile vorkommen:
WegzulassendeZeichen := StrLen(URL)
WegzulassendeZeichen += URLStart
URLSuchZkette := SubStr(URLSuchZkette, WegzulassendeZeichen)
Gosub, URLSuche  ; Rekursiver Aufruf von sich selbst.
return