Anwendungsgebiet: Stringfunktionen
Die Funktion SEARCH-LIST-INDEX( ) sucht in einer Listenvariablen einen String oder einen nach POSIX-Regeln gebildeten regulären Ausdruck. Der Returnwert gibt die Nummer des ersten Listenelements an, das diesen Ausdruck bzw. diesen Suchstring enthält.
Normalerweise - wenn man eine solche Operation durch eine Schleife mit der Funktion INDEX ausführen lässt - benötigt man dafür sehr viel Zeit. Durch die Einführung dieser vordefinierten Funktion wird die Ausführungszeit wesentlich reduziert, da die Suche in einem Schritt ausgeführt wird.
Format
SEARCH-LIST-INDEX( ) |
LIST-VARIABLE-NAME = string_ausdruck1 ,PATTERN = string_ausdruck2 ,BEGIN-INDEX = 1 / arithm_ausdruck ,END-INDEX = *LAST / arithm_ausdruck ,BEGIN-COLUMN = 1 / arithm_ausdruck ,END-COLUMN = *LAST / arithm_ausdruck ,PATTERN-TYPE = *STRING / *REGULAR-EXPRESSION ,DIRECTION = *FORWARD / *REVERSE |
Ergebnistyp
INTEGER
Eingabeparameter
LIST-VARIABLE-NAME= string_ausdruck1
Bezeichnet die Variable, die aus einer Liste von Strings besteht.
PATTERN = string_ausdruck2
Bezeichnet den Suchstring oder regulären Ausdruck, nach dem sequenziell innerhalb der Listenvariablen gesucht wird, die in LIST-VARIABLE-NAME angegeben ist.
BEGIN-INDEX =
Bezeichnet das erste Listenelement bzw. den Index, bei dem die Suche gestartet wird. Listenelemente mit einem kleineren Index werden nicht geprüft. Ist der angegebene Index größer als die Anzahl der Elemente, wird immer „0“ zurückgegeben; d.h. es wird „nichts gefunden“ zurückgemeldet.
BEGIN-INDEX = 1
Die Suche beginnt beim Listenelement 1, d.h. die Liste wird von Beginn an durchsucht.
BEGIN-INDEX = arithm_ausdruck
Ab dem angegebenen Listenelement beginnt die Suche.
END-INDEX =
Bezeichnet das letzte Listenelement bzw. den Index, bis zu dem gesucht wird.
Ist einschließlich diesem Index nichts gefunden worden, wird immer „0“ zurückgegeben.
END-INDEX = *LAST
Die Suche endet beim letzten Listenelement.
END-INDEX = arithm_ausdruck
Die Suche endet mit dem angegebenen Listenelement.
BEGIN-COLUMN =
Die Suche wird vom Beginn auf einen bestimmten Spaltenbereich beschränkt. BEGIN-COLUMN zeigt das erste Zeichen im String an, das als Suchstart im jeweiligen Element betrachtet wird, um den in PATTERN angegeben Suchstring zu finden.
Wenn PATTERN-TYPE = *REGULAR-EXPRESSION ist, gehört das Zeichen „^“ am Anfang des gesuchten Strings nicht mehr zum eigentlichen Suchstring, sondern trifft genau die Position vor dem in BEGIN-COLUMN angegebenen Wert.
Der durchsuchte String ist leer, wenn das Listenelement weniger Zeichen enthält als bei BEGIN-COLUMN angegeben sind.
BEGIN-COLUMN = 1
Die Suche beginnt ab Spalte 1, d.h. es wird das gesamte Listenelement durchsucht.
BEGIN-COLUMN = arithm_ausdruck
Ab der angegebenen Spalte bzw. ab diesem Zeichen wird in einem Listenelement nach dem Suchstring gesucht.
END-COLUMN =
Die Suche wird vom Ende gesehen auf einen bestimmten Spaltenbereich beschränkt. END-COLUMN zeigt dasjenige Zeichen im String an, das als Suchende im jeweiligen Element betrachtet wird, um den in PATTERN angegeben Suchstring zu finden. Die Zeichen des Listenelements nach der in END-COLUMN bezeichneten Position werden bei der Suche nicht berücksichtigt.
Wenn PATTERN-TYPE = *REGULAR-EXPRESSION ist, trifft das Zeichen „$“ am Ende des gesuchten Strings genau die Position nach dem in END-COLUMN angegebenen Wert (das bedeutet: dieses Zeichen gehört nicht mehr zum eigentlichen Suchstring), oder es trifft das Ende des Listenelements, wenn das Listenelement weniger Zeichen enthält, als bei END-COLUMN angegeben sind.
END-COLUMN = *LAST
Die Suche endet mit dem Ende des Strings bzw. mit dem Ende des Listenelements.
END-COLUMN = arithm_ausdruck
Ab der angegebenen Spalte bzw. ab diesem Zeichen wird in einem Listenelement nach dem Suchstring nicht mehr gesucht.
PATTERN-TYPE =
Bezeichnet den Datentyp des Suchstrings oder gesuchten regulären Ausdrucks.
PATTERN-TYPE = *STRING
Der Datentyp ist STRING.
PATTERN-TYPE = *REGULAR-EXPRESSION
Der Datentyp entspricht dem eines nach POSIX-Regeln erstellten regulären Ausdrucks. Dieser ersetzt eine beliebige, auch leere Zeichenfolge.
DIRECTION =
Bestimmt die Richtung, in der die Listenvariable durchsucht werden soll.
DIRECTION = *FORWARD
Die Suche beginnt bei dem in BEGIN-INDEX bezeichneten Listenelement und endet bei dem in END-INDEX bezeichneten Listenelement.
DIRECTION = *REVERSE
Die Suche verläuft in umgekehrter Richtung, d.h. sie beginnt bei dem in END-INDEX bezeichneten Listenelement und endet bei dem in BEGIN-INDEX bezeichneten Listenelement.
Ergebnis
Positiver Integer-Wert, der das erste Listenelement angibt, welches den in PATTERN angegebenen Suchstring enthält. Dieser Wert ist größer gleich dem in BEGIN-INDEX angegebenen Wert und kleiner gleich der Anzahl der Listenelemente der angegebenen Variablen.
0
Der Suchstring wurde nicht gefunden.
Fehlermeldungen
SDP0492 DER OPERAND PATTERN UND DIE LISTENELEMENTE DUERFEN KEIN NULLBYTE (X'00') ENTHALTEN SDP0493 BEGIN-INDEX, END-INDEX, BEGIN-COLUMN UND END-COLUMN MUESSEN GROESSER NULL SEIN SDP0494 SYNTAXFEHLER IN REGULAEREM AUSDRUCK FUER OPERAND PATTERN SDP1008 VARIABLE BZW. LAYOUT '(&00)' EXISTIERT NICHT SDP1096 VARIABLE '(&00)' MUSS EINE LISTE VOM TYP STRING ODER ANY SEIN UND NUR STRING-WERTE ENTHALTEN
Beispiel 1
/DECLARE-VARIABLE DATEI-NEU(TYPE=*STRING), MULTIPLE-ELEMENTS=*LIST /READ-VARIABLE *LIST(DATEI-NEU), INPUT=*SYSDTA Erste Zeile von der Datei Zweite Dritte Zeile von der Datei 4. 5. ........ 6. von der Datei 7. ... von der ... *END-OF-CMD /MATCH = 0 /REPEAT / MATCH=SEARCH-LIST-INDEX('DATEI-NEU',PATTERN='Zeile', BEGIN-INDEX=MATCH+1) / SHOW-VARIABLE MATCH /UNTIL (MATCH == 0)
Ausgabe
MATCH = 1 MATCH = 3 MATCH = 0
Dieses Beispiel zeigt, wie in der Listenvariablen DATEI-NEU mithilfe von SEARCH-LIST-INDEX( ) nach einem String (hier „Zeile“) ab einem bestimmten Zeichen gesucht wird. Durch die REPEAT-Schleife ist dabei gewährleistet, dass der Wert bei BEGIN-INDEX jeweils um den Wert 1 hochgesetzt wird, bis die gesamte Listenvariable durchlaufen ist. Wird innerhalb der REPEAT-Schleife folgender Ausdruck geschrieben, ändert sich die Ausgabe:
Beispiel 2
/MATCH=SEARCH-LIST-INDEX('DATEI-NEU', - / PATTERN =' von ', - / BEGIN-COLUMN=7,- / END-COLUMN=11) /SHOW-VARIABLE MATCH
Ausgabe
MATCH = 7
In diesem Beispiel wird die Listenvariable DATEI-NEU (siehe Beispiel 1) nach dem String „ von “ durchsucht, wobei die Suche auf den Spaltenbereich Spalte 7 bis (inklusive) Spalte 11 beschränkt wird: Nur das Listenelement 7 erfüllt die Suchbedingung, nicht jedoch die Listenelemente 1, 3 und 6.
Beispiel 3
/DECLARE-VARIABLE RECORD-LIST(TYPE=*STRING), MULTIPLE-ELEMENTS=*LIST /READ-VARIABLE *LIST(RECORD-LIST), INPUT=*SYSDTA WIEDEMANN BERNHARD 64528 BACHMANN MICHAEL 37214 ARTMANN HELMUT 74634 HEUBACH HUGO 97884 BACH ANDREAS 12012 KIRSCHNER ANITA 76325 *END-OF-CMD /NAME = 'BACH' /MATCH=SEARCH-LIST-INDEX('RECORD-LIST', / PATTERN ='^&NAME. ', - / PATTERN-TYPE=*REGULAR-EXPRESSION - / ) /NUMBER = INTEGER(EXTRACT-FIELD(RECORD-LIST#MATCH,3)) /WRITE-TEXT '&NAME. HAS NUMBER &NUMBER.'
Ausgabe
BACH HAS NUMBER 12012
Der Name „BACH“ wird in der Listenvariablen RECORD-LIST gesucht. Es wird nur ein Treffer gemeldet, denn durch die Angabe von PATTERN-TYPE = *REGULAR-EXPRESSION erfüllen „HEUBACH“ und „BACHMANN“ die Kriterien für den gesuchten String nicht: Der eine beginnt nicht mit „B“ und der andere endet nicht mit einem Leerzeichen nach „BACH“.
Beispiel 4
/DECLARE-VARIABLE A-LIST (TYPE=*STRING), MULTIPLE-ELEMENTS=*LIST / A-LIST#1 = 'ACTIVE ' / A-LIST#2 = 'WAITING ' / A-LIST#3 = 'INACTIVE' / A-LIST#4 = 'ABORTED ' / A-LIST#5 = 'ACTIVE ' / A-LIST#6 = 'LOCKED ' / A-LIST#7 = 'WAITING ' / A-LIST#8 = 'ACTIVE ' / A-LIST#9 = 'ACTIVE ' / A-LIST#10 = 'INACTIVE' /WAITING-IDX=SEARCH-LIST-INDEX('A-LIST','WAITING',DIRECTION=*FORWARD) /SHOW-VARIABLE WAITING-IDX WAITING-IDX = 2 /WAITING-IDX=SEARCH-LIST-INDEX('A-LIST','WAITING',DIRECTION=*REVERSE) /SHOW-VARIABLE WAITING-IDX WAITING-IDX = 7
In der Listenvariable A-LIST wird der String „WAITING“ gesucht. Die Vorwärtssuche meldet als Treffer das Listenelement 2. Die Rückwärtssuche meldet das Listenelement 7 als Treffer.