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 im A_WorkingDir-Verzeichnis vermutet wird, wenn kein absoluter Pfad angegeben ist. 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 der Schleife offen bleibt. Sie wird im A_WorkingDir-Verzeichnis vermutet, wenn kein absoluter Pfad angegeben ist.

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, setzt man vor dem Dateinamen ein Sternchen. Dieser Modus schreibt jedes Zeilenumbruchszeichen (`n) als einzelnes LF-Zeichen (LF), anstatt üblicherweise 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. Zwar kann so eine Augabe auf eine Datei umgeleitet, an eine EXE-Datei weitergeleitet oder von originellen Texteditoren abgefangen werden, allerdings erscheint sie nicht in der Eingabeaufforderung, von wo aus sie gestartet wurde. Siehe FileAppend für mehr Details.

Escapezeichen-versehene 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 jedesmal 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 gelesen werden, die bis zu 65.534 Zeichen lang sind. 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 der StringSplit-Befehl 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 man FileRead, weil es deutlich performanter als eine Schleife ist (besonders bei großen Dateien).

Um mehrere Dateien simultan zu lesen oder zu schreiben, nutzt man 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.

Siehe auch

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

Beispiele

; Beispiel #1: 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
{
    IfInString, A_LoopReadLine, Familie, FileAppend, %A_LoopReadLine%`n
}
; Beispiel #2: 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.
; Beispiel #3: Das folgende Beispiel zeigt, wie alle FTP- und HTTP-URLs
; aus einer Text- oder HTML-Datei extrahiert werden können:
FileSelectFile, Quelldatei, 3,, Wählen Sie eine Text- oder HTML-Datei zum Analysieren aus:
if Quelldatei =
    return  ; In diesem Fall beenden.

SplitPath, Quelldatei,, Quelldateipfad,, QuelldateiOhneEndung
Zieldatei = %Quelldateipfad%\%QuelldateiOhneEndung% Extrahierte Links.txt

IfExist, %Zieldatei%
{
    MsgBox, 4,, Vorhandene Datei überschreiben? Drücken Sie Nein, um die Links nur anzufügen.`n`nDATEI: %Zieldatei%
    IfMsgBox, Yes
        FileDelete, %Zieldatei%
}

Linkanzahl = 0
Loop, read, %Quelldatei%, %Zieldatei%
{
    URLSuchZeichenkette = %A_LoopReadLine%
    Gosub, URLSuche
}
MsgBox %Linkanzahl% Links wurden gefunden und in "%Zieldatei%" geschrieben.
return


URLSuche:
; Das wird auf diese Weise gemacht, weil einige URLs andere URLs eingebettet haben:
StringGetPos, URLStart1, URLSuchZeichenkette, http://
StringGetPos, URLStart2, URLSuchZeichenkette, ftp://
StringGetPos, URLStart3, URLSuchZeichenkette, www.

; Findet die Startposition ganz links:
URLStart = %URLStart1%  ; Setzt den Standardwert.
Loop
{
    ; Es hilft der Performance (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 = -1  ; Dieses Element ist disqualifiziert.
        continue
    if URLStart = -1
        URLStart = %ArrayElement%
    else ; URLStart beinhaltet eine gültige Position, also mit ArrayElement vergleichen.
    {
        if ArrayElement <> -1
            if ArrayElement < %URLStart%
                URLStart = %ArrayElement%
    }
}

if URLStart = -1  ; Keine URLs in der URLSuchZeichenkette.
    return

; Extrahiert ansonsten diese URL:
StringTrimLeft, URL, URLSuchZeichenkette, %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
Linkanzahl += 1

; Schaut nach, ob noch andere URLs in dieser Zeile vorkommen:
StringLen, ZuEntfernendeZeichen, URL
ZuEntfernendeZeichen += %URLStart%
StringTrimLeft, URLSuchZeichenkette, URLSuchZeichenkette, %ZuEntfernendeZeichen%
Gosub, URLSuche  ; Ruft sich nochmals selbst auf.
return