SEPARATE
|
operand1 | |||||
SUBSTRING (operand1,operand2,operand3)
|
||||||
[LEFT [JUSTIFIED ]] INTO
operand4
|
||||||
IGNORE
|
||||||
REMAINDER
operand5
|
||||||
WITH [RETAINED ]
|
[ANY ]
DELIMITERS
|
|||||
INPUT DELIMITERS
|
||||||
DELIMITERS
operand6
|
||||||
[[GIVING ]
NUMBER [IN ] operand7]
|
Dieses Dokument behandelt folgende Themen:
Eine Erläuterung der in dem Syntax-Diagramm verwendeten Symbole entnehmen Sie dem Abschnitt Syntax-Symbole.
Verwandte Statements: COMPRESS | COMPUTE | EXAMINE | MOVE | MOVE ALL | RESET
Gehört zur Funktionsgruppe: Arithmetische Funktionen und Datenzuweisungen
Das Statement SEPARATE
dient dazu, den Inhalt eines
alphanumerischen oder binären Operanden auf zwei oder mehr alphanumerische oder
binäre Operanden (oder auf mehrere Ausprägungen eines alphanumerischen oder
binären Arrays) zu verteilen.
Operanden-Definitionstabelle:
Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 | C | S | A | U | B | ja | nein | |||||||||||||
operand2 | C | S | N | P | I | B* | ja | nein | ||||||||||||
operand3 | C | S | N | P | I | B* | ja | nein | ||||||||||||
operand4 | S | A | G | A | U | B | ja | ja | ||||||||||||
operand5 | S | A | U | B | ja | ja | ||||||||||||||
operand6 | C | S | A | U | B | ja | nein | |||||||||||||
operand7 | S | N | P | I | ja | ja |
* Format B von operand2 und operand3 können nur mit einer Länge von kleiner gleich 4 benutzt werden.
Syntax-Element-Beschreibung:
operand1 |
Ausgangsoperand:
operand1 ist die alphanumerische/binäre Konstante oder Variable, deren Inhalt aufgeteilt werden soll. Nachgestellte Leerzeichen in operand1
werden entfernt, bevor der Wert verarbeitet wird (auch wenn das Leerzeichen als
Begrenzungszeichen verwendet wird; vgl. |
---|---|
SUBSTRING |
SUBSTRING-Option:
Normalerweise wird der ganze Inhalt des Feldes aufgeteilt, und zwar vom Anfang des Feldes an. Die Normalerweise wird der ganze Inhalt des Feldes aufgeteilt, und zwar vom Anfang des Feldes an. Anmerkung: |
LEFT JUSTIFIED |
LEFT JUSTIFIED-Option:
Diese Option bewirkt, dass den aufgeteilten Feldwertteilen vorangestellte Leerzeichen aus den Zieloperanden entfernt werden. |
operand4 |
Zieloperand:
operand4 enthält die Zieloperanden, die die Teile des Ausgangsoperanden aufnehmen sollen. Wird als Zieloperand ein Array verwendet, wird es Ausprägung für Ausprägung mit den übertragenen Feldwertteilen gefüllt. Die Anzahl der Zieloperanden entspricht der Anzahl der Begrenzungszeichen (einschließlich nachgestellter Begrenzungszeichen) in operand1, plus 1. Ist operand4 eine dynamische Variable,
kann deren Länge mit der Allgemeine Informationen zu dynamischen Variablen finden Sie im Abschnitt Dynamische und große Variablen benutzen im Leitfaden zur Programmierung. |
IGNORE / |
IGNORE/REMAINDER-Option:
Wenn Sie nicht genug Zieloperanden angeben, um alle Feldwertteile aufzunehmen, erhalten Sie eine entsprechende Fehlermeldung. Um dies zu vermeiden, haben Sie zwei Möglichkeiten:
Siehe auch Beispiel 3. |
DELIMITERS |
DELIMITERS-Option: Siehe
Delimiters-Option
weiter unten.
|
WITH RETAINED DELIMITERS |
WITH RETAINED DELIMITERS-Option:
Normalerweise werden die Begrenzungszeichen selbst nicht mit in die Zieloperanden übertragen. Wenn Sie allerdings Beispiel: Das folgende ... MOVE '150+30' TO #A SEPARATE #A INTO #B #C #D WITH RETAINED DELIMITER '+' ... Siehe auch Beispiel 3. |
GIVING NUMBER operand7 |
GIVING NUMBER-Option
Diese Option bewirkt, dass die Anzahl der Zieloperanden, die mit einem Wert gefüllt wurden (einschließlich der mit Leerzeichen gefüllten), in operand7 ausgegeben wird. Die Anzahl, die Sie erhalten, errechnet sich aus der Anzahl der Delimiterzeichen plus 1. Wenn Sie die Wenn Sie die REMAINDER-Option verwenden, enthält operand7 maximal die Anzahl der Zieloperanden (operand4) plus operand5. |
WITH [RETAINED ]
|
[ANY ]
DELIMITERS
|
||||
INPUT DELIMITERS
|
|||||
DELIMITERS operand6
|
Begrenzungszeichen innerhalb von operand1 bestimmen die Stellen, an denen der Wert geteilt werden soll.
Falls Sie die DELIMITERS
-Option nicht angeben (oder
WITH ANY DELIMITER
angeben), wird jedes Leerzeichen sowie jedes
Zeichen, das weder ein Buchstabe noch eine Ziffer ist, als Begrenzungszeichen
interpretiert.
WITH INPUT DELIMITERS
bedeutet, dass das mit dem Session-Parameter ID
definierte Zeichen
sowie das Leerzeichen als Begrenzungszeichen gelten.
WITH DELIMITERS
operand6
bedeutet, dass jedes der
angegebenen Zeichen (operand6) als
Begrenzungszeichen interpretiert wird. Wenn operand6
nachgestellte Leerzeichen enthält, werden diese ignoriert.
** Example 'SEPEX1': SEPARATE ************************************************************************ DEFINE DATA LOCAL 1 #TEXT1 (A6) INIT <'AAABBB'> 1 #TEXT2 (A7) INIT <'AAA BBB'> 1 #TEXT3 (A7) INIT <'AAA-BBB'> 1 #TEXT4 (A7) INIT <'A.B/C,D'> 1 #FIELD1A (A6) 1 #FIELD1B (A6) 1 #FIELD2A (A3) 1 #FIELD2B (A3) 1 #FIELD3A (A3) 1 #FIELD3B (A3) 1 #FIELD4A (A3) 1 #FIELD4B (A3) 1 #FIELD4C (A3) 1 #FIELD4D (A3) 1 #NBT (N1) 1 #DEL (A5) END-DEFINE * WRITE NOTITLE 'EXAMPLE A (SOURCE HAS NO BLANKS)' SEPARATE #TEXT1 INTO #FIELD1A #FIELD1B GIVING NUMBER #NBT WRITE / '=' #TEXT1 5X '=' #FIELD1A 4X '=' #FIELD1B 4X '=' #NBT * WRITE NOTITLE /// 'EXAMPLE B (SOURCE HAS EMBEDDED BLANK)' SEPARATE #TEXT2 INTO #FIELD2A #FIELD2B GIVING NUMBER #NBT WRITE / '=' #TEXT2 4X '=' #FIELD2A 7X '=' #FIELD2B 7X '=' #NBT * WRITE NOTITLE /// 'EXAMPLE C (USING DELIMITER ''-'')' SEPARATE #TEXT3 INTO #FIELD3A #FIELD3B WITH DELIMITER '-' WRITE / '=' #TEXT3 4X '=' #FIELD3A 7X '=' #FIELD3B * MOVE ',/' TO #DEL WRITE NOTITLE /// 'EXAMPLE D USING DELIMITER' '=' #DEL * SEPARATE #TEXT4 INTO #FIELD4A #FIELD4B #FIELD4C #FIELD4D WITH DELIMITER #DEL WRITE / '=' #TEXT4 4X '=' #FIELD4A 7X '=' #FIELD4B / 19X '=' #FIELD4C 7X '=' #FIELD4D * END
Ausgabe des Programms SEPEX1
:
EXAMPLE A (SOURCE HAS NO BLANKS) #TEXT1: AAABBB #FIELD1A: AAABBB #FIELD1B: #NBT: 1 EXAMPLE B (SOURCE HAS EMBEDDED BLANK) #TEXT2: AAA BBB #FIELD2A: AAA #FIELD2B: BBB #NBT: 2 EXAMPLE C (USING DELIMITER '-') #TEXT3: AAA-BBB #FIELD3A: AAA #FIELD3B: BBB EXAMPLE D USING DELIMITER #DEL: ,/ #TEXT4: A.B/C,D #FIELD4A: A.B #FIELD4B: C #FIELD4C: D #FIELD4D:
** Example 'SEPEX2': SEPARATE (using array variable) ************************************************************************ DEFINE DATA LOCAL 1 #INPUT-LINE (A60) INIT <'VALUE1, VALUE2,VALUE3'> 1 #FIELD (A20/1:5) 1 #NUMBER (N2) END-DEFINE * SEPARATE #INPUT-LINE LEFT JUSTIFIED INTO #FIELD (1:5) GIVING NUMBER IN #NUMBER * WRITE NOTITLE #INPUT-LINE // #FIELD (1) / #FIELD (2) / #FIELD (3) / #FIELD (4) / #FIELD (5) / #NUMBER * END
Ausgabe des Programms SEPEX2
:
VALUE1, VALUE2,VALUE3 VALUE1 VALUE2 VALUE3 3
** Example 'SEPEX3': SEPARATE (with REMAINDER, RETAIN option) ************************************************************************ DEFINE DATA LOCAL 1 #INPUT-LINE (A60) INIT <'VAL1, VAL2, VAL3,VAL4'> 1 #FIELD (A10/1:4) 1 #REM (A30) END-DEFINE * WRITE TITLE LEFT 'INP:' #INPUT-LINE / '#FIELD (1)' 13T '#FIELD (2)' 25T '#FIELD (3)' 37T '#FIELD (4)' 49T 'REMAINDER' / '----------' 13T '----------' 25T '----------' 37T '----------' 49T '------------------------------' * SEPARATE #INPUT-LINE INTO #FIELD (1:2) REMAINDER #REM WITH DELIMITERS ',' WRITE #FIELD(1) 13T #FIELD(2) 25T #FIELD(3) 37T #FIELD(4) 49T #REM * RESET #FIELD(*) #REM SEPARATE #INPUT-LINE INTO #FIELD (1:2) IGNORE WITH DELIMITERS ',' WRITE #FIELD(1) 13T #FIELD(2) 25T #FIELD(3) 37T #FIELD(4) 49T #REM * RESET #FIELD(*) #REM SEPARATE #INPUT-LINE INTO #FIELD (1:4) IGNORE WITH RETAINED DELIMITERS ',' WRITE #FIELD(1) 13T #FIELD(2) 25T #FIELD(3) 37T #FIELD(4) 49T #REM * RESET #FIELD(*) #REM * SEPARATE SUBSTRING(#INPUT-LINE,1,50) INTO #FIELD (1:4) IGNORE WITH DELIMITERS ',' WRITE #FIELD(1) 13T #FIELD(2) 25T #FIELD(3) 37T #FIELD(4) 49T #REM * END
Ausgabe des Programms SEPEX3
:
INP: VAL1, VAL2, VAL3,VAL4 #FIELD (1) #FIELD (2) #FIELD (3) #FIELD (4) REMAINDER ---------- ---------- ---------- ---------- ------------------------------ VAL1 VAL2 VAL3,VAL4 VAL1 VAL2 VAL1 , VAL2 , VAL1 VAL2 VAL3 VAL4