バージョン 6.3.3
 —  ステートメント  —

SEPARATE

SEPARATE

operand1

SUBSTRING (operand1,operand2,operand3)
[LEFT [JUSTIFIED]] INTO operand4

IGNORE

 
REMAINDER operand5

WITH [RETAINED]

[ANY] DELIMITERS
INPUT DELIMITERS
DELIMITERS operand6
[[GIVING] NUMBER [INoperand7]

このドキュメントでは、次のトピックについて説明します。

構文図で使用されている記号については、「構文記号」を参照してください。

関連ステートメント:COMPRESS | COMPUTE | EXAMINE | MOVE | MOVE ALL | RESET

関連機能グループ:「算術演算とデータ移動操作


機能

SEPARATE ステートメントは 1 つの英数字またはバイナリオペランドの内容を複数の英数字またはバイナリオペランド(または英数字やバイナリ配列の複数オカレンス)に分割するために使用します。

Top of page

構文説明

オペランド定義テーブル:

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
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 内の末尾の空白は、その値が処理される前に削除されます(デリミタ文字として空白を使用する場合でも同様です。DELIMITERS オプションも参照)。

SUBSTRING

通常、フィールドの内容全体が先頭から分割されます。

SUBSTRING オプションでは、フィールドの一部だけを分割できます。 SUBSTRING 節のフィールド名(operand1)の後に、まず開始位置(operand2)、次に分割するフィールド部分の長さ(operand3)を指定します。 例えば、フィールド #A の値が "CONTRAPTION" の場合、SUBSTRING(#A,5,3) の内容は "RAP" を示します。

注意:
operand2 を省略すると、開始位置は "1" と見なされます。 operand3 を省略すると、長さはフィールドの開始位置から終わりまでと見なされます。

LEFT JUSTIFIED このオプションでは、ターゲットオペランドからデリミタ文字と次の空白以外の文字の間に存在する先頭の空白を削除します。
operand4
ターゲットオペランド:

operand4 は、ターゲットオペランドを表します。 ターゲットオペランドとして配列が指定されている場合、分割された値は各オカレンスに送られます。

ターゲットオペランドの個数は、operand1 内のデリミタ文字(末尾のデリミタ文字を含む)の個数に 1 を加えたものに相当します。

operand4 がダイナミック変数の場合、SEPARATE 操作によってその長さを変更できます。 ダイナミック変数の現在の長さは、システム変数 *LENGTH を使用して確認できます。

ダイナミック変数に関する全般的な情報については、「ラージ変数/フィールドとダイナミック変数/フィールド」を参照してください。

IGNORE /

REMAINDER operand5

分割されたソース値を受け取るターゲットフィールドが足りないと、該当するエラーメッセージが返されます。

これを避けるために、次の 2 つのオプションを使用できます。

  • IGNORE を指定すると、Natural はソース値を受け取るターゲットオペランドが足りない場合はそれを無視します。

  • REMAINDER operand5 を指定すると、ターゲットオペランドに挿入できなかったソース値はoperand5 に挿入されます。 operand5 の内容は、後続の SEPARATE ステートメントなどの処理に使用できます。

例 3 も参照してください。

DELIMITERS 下記の「デリミタオプション」を参照してください。
WITH RETAINED DELIMITERS

通常、デリミタ文字自体はターゲットオペランドには移されません。

RETAINED を指定すると、デリミタ(デフォルトのデリミタや空白、あるいはoperand6 で指定されたデリミタ)もターゲットオペランドに挿入されます。

例:

次の SEPARATE ステートメントでは、"150" を #B、"+" を #C、"30" を #D に挿入しています。

...
MOVE '150+30' TO #A
SEPARATE #A INTO #B #C #D WITH RETAINED DELIMITER '+'
...

例 3 も参照してください。

GIVING NUMBER operand7

GIVING NUMBER オプションでは、値(空白で返されたものも含む)が挿入されたターゲットオペランドの個数を operand7 に返します。 実際に得られる数はデリミタ文字の個数に 1 を加えたものです。

IGNORE オプションを使用した場合、operand7 に返される有効な最大数はターゲットオペランド(operand4)の個数です。

REMAINDER オプションを使用した場合、operand7 に返される有効な最大数はターゲットオペランド(operand4)の個数に operand5 を加えたものです。

デリミタオプション:

WITH [RETAINED]

[ANY] DELIMITERS

INPUT DELIMITERS
DELIMITERS operand6

operand1 内のデリミタ文字は、値を分割する位置を示します。

Top of page

例 1 - 各種サンプル

** 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                                                     

プログラム 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:                  

例 2 - 配列の使用

** 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

プログラム SEPEX2 の出力:

VALUE1,   VALUE2,VALUE3
                       
VALUE1                 
VALUE2                 
VALUE3                 
                       
                       
  3                   

例 3 - REMAINDER/RETAINED オプションの使用

** 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                                                              

プログラム 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                                     

Top of page