Loop (Zeichenkette parsen)

Ruft Teile (Felder) einer Zeichenkette einzeln ab.

Loop, Parse, EingabeVar , Trennzeichen, ZuEntfernendeZeichen

Parameter

Parse

Dieser Parameter muss das Wort PARSE sein, und darf, im Gegensatz zu den anderen Schleifenvarianten, keine Variablenreferenz enthalten, die in das Wort PARSE aufgelöst wird.

EingabeVar

Name der Variable, deren Inhalt geparst werden soll. Umschließen Sie den Namen nicht mit Prozentzeichen, es sei denn, Sie wollen den Inhalt der Variable als Namen verwenden.

[v1.1.21+]: Dieser Parameter kann ein % Ausdruck sein, allerdings muss das Prozent-Leerzeichen-Präfix verwendet werden.

Trennzeichen

Fehlt dieser Parameter oder ist er leer, wird jedes Zeichen in EingabeVar als einzelne Teilzeichenkette behandelt.

Enthält dieser Parameter CSV, wird EingabeVar als Zeichenkette mit komma-getrennten Werten angesehen (Comma-Separated Values). Das folgende Beispiel ist eine CSV-Zeile, die mit MS-Excel erstellt wurde:

"Erstes Feld",ZweitesFeld,"Das Wort ""Spezial"" in direkt geschriebenen Anführungszeichen",,"Letztes Feld, das ein direkt geschriebenes Komma hat"

Ansonsten kann Trennzeichen ein oder mehrere Zeichen enthalten (Groß-/Kleinschreibung-sensitiv), um zu bestimmen, wo die Abgrenzungen zwischen den Teilzeichenketten in EingabeVar erfolgen sollen.

Die Trennzeichen selbst werden nicht als Teil der Teilzeichenkette angesehen. Wenn zwischen zwei Trennzeichen in EingabeVar nichts vorhanden ist, wird die entsprechende Teilzeichenkette leer sein.

Zum Beispiel: `, (ein Escapezeichen-versehenes Komma) würde die Zeichenkette jeweils bei einem Komma teilen. Im Vergleich dazu würde %A_Tab%%A_Space% eine neue Teilzeichenkette erstellen, wann immer ein Leer- oder Tabulatorzeichen in EingabeVar gefunden wird.

Um eine Zeichenkette anstelle eines Zeichens als Trennung zu verwenden, ersetzt man mit StringReplace zunächst alle Vorkommen der Zeichenkette mit einem einzelnen Zeichen, das nie im Text genutzt wird. Zum Beispiel: ¢¤¥¦§©ª«®µ¶. Das folgende Beispiel zeigt, wie die Zeichenkette <br> als Trennung verwendet werden kann:

StringReplace, NeueHTML, HTMLZeichenkette, <br>, ¢, All
Loop, parse, NeueHTML, ¢ ; Parst die Zeichenkette basierend auf das Cent-Symbol.
{
...
}
ZuEntfernendeZeichen

Eine optionale Liste mit Zeichen (Groß-/Kleinschreibung-sensitiv), die bei jeder Teilzeichenkette am Anfang und Ende entfernt werden sollen. Wenn ZuEntfernendeZeichen beispielsweise %A_Space%%A_Tab% wäre, wird bei jeder abgerufenen Teilzeichenkette Leer- oder Tabulatorzeichen am Anfang und Ende (aber nicht in der Mitte) entfernt.

Wenn Trennzeichen leer ist, wird ZuEntfernendeZeichen kennzeichnen, welche Zeichen nicht geparst werden sollen (die Schleife wird sie nicht sehen).

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

Bemerkungen

Eine zeichenkette-parsende Schleife ist nützlich, wenn Sie alle Felder in einer Zeichenkette einzeln abarbeiten wollen. Eine parsende Schleife verbraucht weniger Speicher als StringSplit (da StringSplit ein permanentes Pseudo-Array erzeugt) und ist in den meisten Fällen leichter zu verwenden.

Die interne Variable A_LoopField ist nur in einer parsenden Schleife von Bedeutung. Sie enthält den Inhalt der aktuellen Teilzeichenkette (Feld) aus EingabeVar. Wenn eine innere parsende Schleife von einer äußeren parsenden Schleife umschlossen ist, wird das Feld von der innersten Schleife Vorrang haben.

Zwar gibt es nicht die interne Variable "A_LoopDelimiter", allerdings zeigt das Beispiel ganz unten, wie man ermitteln kann, welche Trennung bei jedem Feld verwendet wurde.

EingabeVar oder ihre Felder können eine unbegrenzte Größe haben. Wenn sich der Inhalt von EingabeVar während einer Schleife ändert, wird die Schleife die Änderungen nicht berücksichtigen, weil sie eine temporäre Kopie des originalen Inhalts abarbeitet.

Mit dem Sort-Befehl können die Felder vor dem Parsen neu angeordnet werden.

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

Siehe auch

StringSplit, Datei-lesende Schleife, Loop, Break, Continue, Blöcke, Sort, FileSetAttrib, FileSetTime

Beispiele

; Beispiel #1:
Farben = rot,grün,blau
Loop, parse, Farben, `,
{
    MsgBox, Farbnummer %A_Index% ist %A_LoopField%.
}
; Beispiel #2: Liest den Inhalt einer Variable zeilenweise aus (so ähnlich wie eine Datei-lesende Schleife).
; Mit FileRead kann eine Datei in eine Variable geladen werden:
Loop, parse, Dateiinhalt, `n, `r  ; Durch die Angabe von `n vor `r können sowohl Windows- als auch Unix-Dateien geparst werden.
{
    MsgBox, 4, , Zeilennummer %A_Index% ist %A_LoopField%.`n`nWeiter?
    IfMsgBox, No, break
}
; Beispiel #3: Dieses Beispiel ist das gleiche wie oben, außer dass es für die Zwischenablage ist.
; Es ist nützlich, wann immer die Zwischenablage Dateien enthält, wie z. B. solche, die von einem offenen Explorer-Fenster
; kopiert wurden (das Programm wandelt solche Dateien automatisch in ihre Dateinamen um):
Loop, parse, clipboard, `n, `r
{
    MsgBox, 4, , Dateinummer %A_Index% ist %A_LoopField%.`n`nWeiter?
    IfMsgBox, No, break
}
; Beispiel #4: Parst eine Datei mit kommagetrennten Werten (CSV):
Loop, read, C:\Datenbank-Export.csv
{
    Zeilennummer = %A_Index%
    Loop, parse, A_LoopReadLine, CSV
    {
        MsgBox, 4, , Feld %Zeilennummer%-%A_Index% ist:`n%A_LoopField%`n`nWeiter?
        IfMsgBox, No
            return
    }
}
; Beispiel #5: Dieses Beispiel stellt fest, welche Trennung verwendet wurde.

; Initialisiert die zu durchsuchenden Zeichenkette.
Farben = Rot,Grün|Blau;Gelb|Cyan,Magenta
; Initialisiert einen Zähler, um unsere aktuelle Zeichenkettenposition im Auge zu behalten.
Position := 0

Loop, Parse, Farben, `,|;
{
    ; Berechnet die Position der Trennung am Ende dieses Feldes.
    Position += StrLen(A_LoopField) + 1
    ; Ermittelt die Trennung, die von der parsenden Schleife gefunden wurde.
    Trennung := SubStr(Farben, Position, 1)

    MsgBox Feld: %A_LoopField%`Trennung: %Trennung%
}