このドキュメントでは、次のトピックについて説明します。
構文図で使用されている記号については、「構文記号」を参照してください。
関連ステートメント:COMPRESS | COMPUTE | EXAMINE | MOVE | MOVE ALL | RESET
関連機能グループ:「算術演算とデータ移動操作」
SEPARATE
ステートメントは 1 つの英数字またはバイナリオペランドの内容を複数の英数字またはバイナリオペランド(または英数字やバイナリ配列の複数オカレンス)に分割するために使用します。
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | ステートメント参照 | ダイナミック定義 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 | C | S | A | U | B | 可 | 不可 | |||||||||||||
operand2 | C | S | N | P | I | B* | 可 | 不可 | ||||||||||||
operand3 | C | S | N | P | I | B* | 可 | 不可 | ||||||||||||
operand4 | S | A | G | A | U | B | 可 | 可 | ||||||||||||
operand5 | S | A | U | B | 可 | 可 | ||||||||||||||
operand6 | C | S | A | U | B | 可 | 不可 | |||||||||||||
operand7 | S | N | P | I | 可 | 可 |
* operand2 および operand3 のフォーマット B は、4 以下の長さでのみ使用できます。
構文要素の説明:
operand1 |
ソースオペランド:
operand1 は、内容を分割する英数字/バイナリの定数または変数です。 operand1 内の末尾の空白は、その値が処理される前に削除されます(デリミタ文字として空白を使用する場合でも同様です。 |
---|---|
SUBSTRING |
通常、フィールドの内容全体が先頭から分割されます。
注意: |
LEFT JUSTIFIED | このオプションでは、ターゲットオペランドからデリミタ文字と次の空白以外の文字の間に存在する先頭の空白を削除します。 |
operand4 |
ターゲットオペランド:
operand4 は、ターゲットオペランドを表します。 ターゲットオペランドとして配列が指定されている場合、分割された値は各オカレンスに送られます。 ターゲットオペランドの個数は、operand1 内のデリミタ文字(末尾のデリミタ文字を含む)の個数に 1 を加えたものに相当します。 operand4 がダイナミック変数の場合、 ダイナミック変数に関する全般的な情報については、「ラージ変数/フィールドとダイナミック変数/フィールド」を参照してください。 |
IGNORE / |
分割されたソース値を受け取るターゲットフィールドが足りないと、該当するエラーメッセージが返されます。 これを避けるために、次の 2 つのオプションを使用できます。
例 3 も参照してください。 |
DELIMITERS | 下記の「デリミタオプション」を参照してください。 |
WITH RETAINED DELIMITERS |
通常、デリミタ文字自体はターゲットオペランドには移されません。
例: 次の ... MOVE '150+30' TO #A SEPARATE #A INTO #B #C #D WITH RETAINED DELIMITER '+' ... 例 3 も参照してください。 |
GIVING NUMBER operand7 |
|
WITH [RETAINED ]
|
[ANY ] DELIMITERS
|
||||
INPUT DELIMITERS
|
|||||
DELIMITERS operand6
|
operand1 内のデリミタ文字は、値を分割する位置を示します。
DELIMITERS
オプションを省略した場合(または WITH ANY DELIMITERS
を指定した場合)、空白、および英字や数字以外の任意の文字がデリミタ文字として扱われます。
WITH INPUT DELIMITERS
は、空白およびデフォルトの INPUT 区切り文字(セッションパラメータ ID
で指定)がデリミタ文字として使用されることを示します。
WITH DELIMITERS operand6
は、指定した各文字(operand6)がデリミタ文字として使用されることを示します。 operand6 に含まれる末尾の空白は無視されます。
** 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
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
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
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