このドキュメントでは、次のトピックについて説明します。
関連ステートメント:ADD | COMPRESS | COMPUTE | DIVIDE | MOVE | MOVE ALL | MULTIPLY | RESET | SEPARATE | SUBTRACT
関連機能グループ:「算術演算とデータ移動操作」
EXAMINE |
[FULL [VALUE [OF ]]]
|
operand1 | ||
SUBSTRING (operand1,operand2,operand3)
|
||||
[FOR ] [FULL [VALUE [OF ]]] [PATTERN ] operand4
|
||||
[DELIMITERS-option] | ||||
{[DELETE-REPLACE-clause] [GIVING-clause]} |
構文図で使用されている記号については、「構文記号」を参照してください。
EXAMINE
ステートメントは、英数字やバイナリフィールドの内容、または配列内にあるフィールドの範囲を調べるため、および次の目的で使用します。
検索パターンが見つかった回数を返します。
検索パターンが最初に出現したバイト位置を返します。
フィールドの有効な内容の長さ(末尾の空白を除いたフィールド長)を返します。
パターンが最初に見つかった配列フィールドのオカレンス番号(インデックス)を返します。
パターンを別のパターンで置換します。
パターンを削除します。
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 | C* | S | A | A | U | B | 可 | 不可 | ||||||||||||
operand2 | C | S | N | P | I | B* | 可 | 不可 | ||||||||||||
operand3 | C | S | N | P | I | B* | 可 | 不可 | ||||||||||||
operand4 | C | S | A | U | B | 可 | 不可 |
* GIVING
節を使用する場合、operand1 に定数を指定できます。DELETE
または REPLACE
節を使用する場合、定数の指定はできません。
* operand2 および operand3 のフォーマット B は、4 以下の長さでのみ使用できます。
構文要素の説明:
operand1 |
operand1 では、内容を調べるフィールドを指定します。 operand1 が |
---|---|
operand4 |
operand4 では、EXAMINE 操作に使用する値を指定します。 |
FULL | オペランドに FULL を指定すると、末尾の空白も含めて値全体が処理されます。 FULL を指定しない場合は、オペランド内の末尾の空白は無視されます。
|
SUBSTRING |
通常、フィールドの内容はフィールドの始めから終わりまでまたは空白以外の最後の文字まで調べられます。
例えば、フィールド #A の 5 番目から 12 番目を調べるには、次のように指定します。 EXAMINE SUBSTRING(#A,5,8). 注意:
|
PATTERN |
"ワイルドカード文字"(調べる対象から除外する位置を示す記号)を含む値でフィールドを調べる場合は、
例: |
DELIMITERS-option | このオプションは、デリミタを示す値を検索するために使用します。 詳細については、下記の「DELIMITERS オプション」を参照してください。 |
DELETE-REPLACE-clause | この節の DELETE オプションは、operand1 で見つかった各検索値(operand4)を削除するために使用します。一方、REPLACE オプションは、operand6 で指定した値によって operand1 で見つかった各検索値(operand4)を置換するために使用します。 詳細については、下記の「DELETE REPLACE 節」を参照してください。
|
GIVING-clause | 詳細については、下記の「GIVING 節」を参照してください。 |
ABSOLUTE |
||
[WITH DELIMITERS ] |
||
[WITH DELIMITERS ] operand5 |
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand5 | C | S | A | B | 可 | 不可 |
構文要素の説明:
[AND ]
|
DELETE [FIRST ]
|
||
REPLACE [FIRST ] [WITH ] [FULL [VALUE [OF ]]] operand6 |
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand6 | C | S | A | U | B | 可 | 不可 |
構文要素の説明:
DELETE | operand1 の内容から、検索値(operand4)の最初(またはすべて)のオカレンスを削除するために使用します。 |
---|---|
REPLACE | operand1 にある検索値(operand4)の最初(またはすべて)のオカレンスを、operand6 で指定した値に置換します。 |
FIRST | キーワード FIRST を指定すると、最初の同じ値のみを削除または置換できます。
|
注意:
REPLACE
操作の結果が operand1 に入り切らない場合は、エラーメッセージが返されます。
REPLACE
操作でフィールドの長さを拡張または縮小できます。また、DELETE
操作で、フィールド長をゼロに設定することもできます。 ダイナミック変数の現在の長さは、システム変数 *LENGTH
を使用して確認できます。 ダイナミック変数の一般的な情報については、「ダイナミック変数の使用」を参照してください。
GIVING |
|||||||||
NUMBER |
|||||||||
[GIVING ]
|
POSITION |
[IN ]
|
operand7 | ||||||
LENGTH |
|||||||||
[GIVING ]
|
INDEX |
[IN ]
|
operand7...3 |
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand7 | S | N | P | I | 可 | 可 |
構文要素の説明:
GIVING | キーワード GIVING だけを指定した場合、これは GIVING NUMBER (デフォルト)に相当します。
|
---|---|
NUMBER | 内容を調べるフィールド(operand1)で検索値(operand4)が見つかった回数を取得するために使用します。 |
POSITION | operand1(または operand1 のサブストリング)内で operand4 と同じ値が初めて出現したバイト位置を取得するために使用します。 |
LENGTH | すべての削除または置換操作が完了した後の operand1(または operand1 のサブストリング)に残っている内容の長さを取得するために使用します。 末尾にある空白は無視されます。 |
operand7 | 検索値のオカレンス数を指定します。 REPLACE FIRST または DELETE FIRST オプションを同時に使用する場合は、1 を超えないようにする必要があります。
|
INDEX operand7...3 | 下記を参照してください。 |
[GIVING ] INDEX [IN ] operand7 3 |
このオプションは、調べられる基礎のフィールドが配列フィールドの場合にのみ適用できます。
構文要素の説明:
INDEX | GIVING INDEX は、最初の検索値(operand4)が見つかった operand1 の配列オカレンス番号(インデックス)を取得するために使用します。
|
---|---|
operand7...3 | operand1 の数(最大 3 個)は、 operand7 の次元数と一致させる必要があります。検索値がどのオカレンスでも見つからなかった場合、 operand7 には 0 が入ります。
|
注意:
operand1 のインデックス範囲にオカレンス 0(0:5 など)が含まれている場合、operand7 の 0
値は正確ではありません。 この場合、GIVING NUMBER
節を追加して検索値が実際に見つかったかどうかを明確にする必要があります。
EXAMINE |
operand1 | [AND ]
|
||||||||
SUBSTRING |
(operand1,operand2,operand3) | |||||||||
TRANSLATE |
INTO
|
UPPER |
[CASE ]
|
|||||||
LOWER |
||||||||||
USING [INVERTED ] (operand4)
|
構文図で使用されている記号については、「構文記号」を参照してください。
EXAMINE TRANSLATE
ステートメントでは、フィールド内の文字を大文字や小文字、または他の文字に変換します。
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 | S | A | A | B | 可 | 不可 | |||||||||||||
operand2 | C | S | N | P | I | B* | 可 | 不可 | |||||||||||
operand3 | C | S | N | P | I | B* | 可 | 不可 | |||||||||||
operand4 | S | A | A | B | 可 | 不可 |
*operand2 および operand3 のフォーマット B は、4 以下の長さでのみ使用できます。
構文要素の説明:
EXAMINE operand1 |
フィールド内容の全体の変換:
operand1 で指定したフィールドの内容が変換されます。 |
---|---|
EXAMINE SUBSTRING operand1 operand2 operand3 |
フィールド内容の一部分の変換:
通常は、フィールドの内容全体が変換されます。
例えば、フィールド #A の 5 番目から 12 番目を変換する場合は、次のように指定します。 EXAMINE SUBSTRING(#A,5,8) AND TRANSLATE ... 注意: |
TRANSLATE INTO UPPER CASE |
大文字変換:
operand1 の内容が大文字に変換されます。 |
TRANSLATE INTO LOWER CASE |
小文字変換:
operand1 の内容が小文字に変換されます。 |
TRANSLATE USING operand4 |
使用する変換テーブル:
operand4 は、文字変換に使用する変換テーブルです。 テーブルのフォーマット/長さは、A2 または B2 にする必要があります。 注意: |
INVERTED | キーワード INVERTED を指定すると、変換テーブル(operand4)は逆に使用されます。つまり、変換の方向が逆転します。
|
EXAMINE [FULL [VALUE [OF ]]] |
operand1 |
||
SUBSTRING (operand1,operand2,operand3 )
|
|||
[FOR ]
|
|
||
[GIVING ] POSITION IN operand6 [[GIVING ] LENGTH IN operand7 ]
|
構文図で使用されている記号については、「構文記号」を参照してください。
"grapheme" は、ユーザーが一般に文字と見なすものです。 ほとんどの場合、UTF-16 コード単位(= U 形式文字)が書記素になりますが、書記素は複数のコード単位で構成されることもあります。 例えば、一連の基本文字の後に、結合文字またはサロゲートペアが続きます。 書記素および他の Unicode 用語の詳細については、http://www.unicode.org/ にある『The Unicode Standard』を参照してください。
U 形式オペランド用の EXAMINE
ステートメントは、通常、コード単位に対して機能します。 ただし、CHARPOSITION
および CHARLENGTH
節を使用している場合は、書記素シーケンスの開始位置と長さ(コード単位での)を取得できます。 返されるコード単位の値は、コード単位のオペランドを必要とする他のステートメントまたは節で使用できます(例:SUBSTRING
節)。
EXAMINE
ステートメントのこの構文に関する詳細については、「Natural プログラミング言語での Unicode およびコードページのサポート」の「ステートメント」セクションと「EXAMINE」セクションも参照してください。
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 | C | S | A | U | B | 可 | 不可 | ||||||||||||
operand2 | C | S | N | P | I | B* | 可 | 不可 | |||||||||||
operand3 | C | S | N | P | I | B* | 可 | 不可 | |||||||||||
operand4 | C | S | N | P | I | 可 | 不可 | ||||||||||||
operand5 | C | S | N | P | I | 可 | 不可 | ||||||||||||
operand6 | C | S | N | P | I | 可 | 不可 | ||||||||||||
operand7 | C | S | N | P | I | 可 | 不可 |
* operand2 および operand3 のフォーマット B は、4 以下の長さでのみ使用できます。
構文要素の説明:
FULL | オペランドに FULL を指定すると、末尾の空白も含めて値全体が処理されます。 FULL を指定しない場合は、オペランド内の末尾の空白は無視されます。
|
---|---|
SUBSTRING operand1 operand2 operand3 |
通常、フィールドの内容はフィールドの始めから終わりまでまたは空白以外の最後の文字まで調べられます。
例えば、フィールド #A の 5 番目から 12 番目を調べるには、次のように指定します。 EXAMINE SUBSTRING (#A,5,8) 注意:
|
CHARPOSITION operand4 | operand4 では、書記素シーケンスの開始位置(Unicode 書記素)を定義します。 対応する位置(コード単位)が、operand6 で返されます。 CHARLENGTH 節が指定されている場合は、この節を省略できます。その場合、開始位置は 1 とみなされます。
|
CHARLENGTH operand5 | operand5 では、書記素シーケンスの長さ(Unicode 書記素)を定義します。 書記素シーケンスの長さ(コード単位)が、operand7 で返されます。 CHARPOSITION 節が指定されている場合は、この節を省略できます。その場合は、開始位置から文字列の末尾までの長さが返されます。
|
GIVING POSITION IN operand6 | operand6 は、operand4 と operand5 によって定義された書記素シーケンスの開始位置(コード単位)を受け取ります。 オペランド 1 が operand4 書記素よりも小さい場合は、0 が返されます。 GIVING LENGTH 節が指定されている場合は、この節を省略できます。
|
GIVING LENGTH IN operand7 | operand7 は、operand4 と operand5 によって定義された書記素シーケンスの長さ(コード単位)を受け取ります。 operand1 が operand4+operand5 書記素よりも小さい場合は、0 が返されます。 GIVING POSITION 節が指定されている場合は、この節を省略できます。
|
注意:
CHARPOSITION
と CHARLENGTH
節の一方または両方を指定する必要があります。
GIVING POSITION
と GIVING LENGTH
節の一方または両方を指定する必要があります。
** Example 'EXMEX1': EXAMINE ************************************************************************ DEFINE DATA LOCAL 1 #TEXT (A40) 1 #A (A1) 1 #START (N2) 1 #NMB1 (N2) 1 #NMB2 (N2) 1 #NMB3 (N2) 1 #NMBEX2 (N2) 1 #NMBEX3 (N2) 1 #NMBEX4 (N2) 1 #POSEX5 (N2) 1 #LGHEX6 (N2) 1 #NMBEX7 (N2) 1 #NMBEX8 (N2) END-DEFINE * WRITE 'EXAMPLE 1 (GIVING NUMBER, WITH DELIMITER)' MOVE 'ABC A B C .A. .B. .C. -A- -B- -C- ' TO #TEXT ASSIGN #A = 'A' EXAMINE #TEXT FOR #A GIVING NUMBER #NMB1 EXAMINE #TEXT FOR #A WITH DELIMITER GIVING NUMBER #NMB2 EXAMINE #TEXT FOR #A WITH DELIMITER '.' GIVING NUMBER #NMB3 WRITE NOTITLE '=' #NMB1 '=' #NMB2 '=' #NMB3 * WRITE / 'EXAMPLE 2 (WITH DELIMITER, REPLACE, GIVING NUMBER)' WRITE '=' #TEXT EXAMINE #TEXT FOR #A WITH DELIMITER '-' REPLACE WITH '*' GIVING NUMBER #NMBEX2 WRITE '=' #TEXT '=' #NMBEX2 * WRITE / 'EXAMPLE 3 (REPLACE, GIVING NUMBER)' WRITE '=' #TEXT EXAMINE #TEXT ' ' REPLACE WITH '+' GIVING NUMBER #NMBEX3 WRITE '=' #TEXT '=' #NMBEX3 * WRITE / 'EXAMPLE 4 (FULL, REPLACE, GIVING NUMBER)' WRITE '=' #TEXT EXAMINE FULL #TEXT ' ' REPLACE WITH '+' GIVING NUMBER #NMBEX4 WRITE '=' #TEXT '=' #NMBEX4 * WRITE / 'EXAMPLE 5 (DELETE, GIVING POSITION)' WRITE '=' #TEXT EXAMINE #TEXT '+' DELETE GIVING POSITION #POSEX5 WRITE '=' #TEXT '=' #POSEX5 * WRITE / 'EXAMPLE 6 (DELETE, GIVING LENGTH)' WRITE '=' #TEXT EXAMINE #TEXT FOR 'A' DELETE GIVING LENGTH #LGHEX6 WRITE '=' #TEXT '=' #LGHEX6 * * NEWPAGE * MOVE 'ABC A B C .A. .B. .C. -A- -B- -C- ' TO #TEXT * ASSIGN #A = 'A B C' ASSIGN #START = 6 * WRITE / 'EXAMPLE 7 (SUBSTRING, GIVING NUMBER)' WRITE '=' #TEXT EXAMINE SUBSTRING(#TEXT,#START,9) FOR #A GIVING NUMBER #NMBEX7 WRITE '=' #TEXT '=' #NMBEX7 * WRITE / 'EXAMPLE 8 (PATTERN, GIVING NUMBER)' WRITE '=' #TEXT EXAMINE #TEXT FOR PATTERN '-A-' GIVING NUMBER #NMBEX8 WRITE '=' #TEXT '=' #NMBEX8 * END
EXAMPLE 1 (GIVING NUMBER, WITH DELIMITER) #NMB1: 4 #NMB2: 3 #NMB3: 1 EXAMPLE 2 (WITH DELIMITER, REPLACE, GIVING NUMBER) #TEXT: ABC A B C .A. .B. .C. -A- -B- #TEXT: ABC A B C .A. .B. .C. -*- -B- #NMBEX2: 1 EXAMPLE 3 (REPLACE, GIVING NUMBER) #TEXT: ABC A B C .A. .B. .C. -*- -B- #TEXT: ABC+++A+B+C+++.A.++.B.++.C.++++-*-++-B- #NMBEX3: 18 EXAMPLE 4 (FULL, REPLACE, GIVING NUMBER) #TEXT: ABC+++A+B+C+++.A.++.B.++.C.++++-*-++-B- #TEXT: ABC+++A+B+C+++.A.++.B.++.C.++++-*-++-B-+ #NMBEX4: 1 EXAMPLE 5 (DELETE, GIVING POSITION) #TEXT: ABC+++A+B+C+++.A.++.B.++.C.++++-*-++-B-+ #TEXT: ABCABC.A..B..C.-*--B- #POSEX5: 4 EXAMPLE 6 (DELETE, GIVING LENGTH) #TEXT: ABCABC.A..B..C.-*--B- #TEXT: BCBC...B..C.-*--B- #LGHEX6: 18
EXAMPLE 7 (SUBSTRING, GIVING NUMBER) #TEXT: ABC A B C .A. .B. .C. -A- -B- #TEXT: ABC A B C .A. .B. .C. -A- -B- #NMBEX7: 1 EXAMPLE 8 (PATTERN, GIVING NUMBER) #TEXT: ABC A B C .A. .B. .C. -A- -B- #TEXT: ABC A B C .A. .B. .C. -A- -B- #NMBEX8: 1
** Example 'EXMEX2': EXAMINE TRANSLATE ************************************************************************ DEFINE DATA LOCAL 1 #TEXT (A50) 1 #TAB (A2/1:10) 1 #START (N2) END-DEFINE * MOVE 'ABC A B C .A. .B. .C. -A- -B- -C- ' TO #TEXT * MOVE 'AX' TO #TAB(1) MOVE 'BY' TO #TAB(2) MOVE 'CZ' TO #TAB(3) * * WRITE 'EXAMPLE 1 (USING TRANSLATION TABLE)' WRITE '=' #TEXT EXAMINE #TEXT TRANSLATE USING #TAB(*) WRITE NOTITLE '=' #TEXT * WRITE / 'EXAMPLE 2 (USING INVERTED TRANSLATION TABLE)' WRITE '=' #TEXT EXAMINE #TEXT TRANSLATE USING INVERTED #TAB(*) WRITE NOTITLE '=' #TEXT * WRITE / 'EXAMPLE 3 (USING SUBSTRING, LOWER CASE)' WRITE '=' #TEXT ASSIGN #START = 13 EXAMINE SUBSTRING(#TEXT,#START,15) TRANSLATE INTO LOWER CASE WRITE '=' #TEXT END
EXAMPLE 1 (USING TRANSLATION TABLE) #TEXT: ABC A B C .A. .B. .C. -A- -B- -C- #TEXT: XYZ X Y Z .X. .Y. .Z. -X- -Y- -Z- EXAMPLE 2 (USING INVERTED TRANSLATION TABLE) #TEXT: XYZ X Y Z .X. .Y. .Z. -X- -Y- -Z- #TEXT: ABC A B C .A. .B. .C. -A- -B- -C- EXAMPLE 3 (USING SUBSTRING, LOWER CASE) #TEXT: ABC A B C .A. .B. .C. -A- -B- -C- #TEXT: ABC A B C .a. .b. .c. -A- -B- -C-
** Example 'EXMEX2': EXAMINE TRANSLATE ************************************************************************ DEFINE DATA LOCAL 1 #TEXT (A50) 1 #TAB (A2/1:10) 1 #START (N2) END-DEFINE * MOVE 'ABC A B C .A. .B. .C. -A- -B- -C- ' TO #TEXT * MOVE 'AX' TO #TAB(1) MOVE 'BY' TO #TAB(2) MOVE 'CZ' TO #TAB(3) * * WRITE 'EXAMPLE 1 (USING TRANSLATION TABLE)' WRITE '=' #TEXT EXAMINE #TEXT TRANSLATE USING #TAB(*) WRITE NOTITLE '=' #TEXT * WRITE / 'EXAMPLE 2 (USING INVERTED TRANSLATION TABLE)' WRITE '=' #TEXT EXAMINE #TEXT TRANSLATE USING INVERTED #TAB(*) WRITE NOTITLE '=' #TEXT * WRITE / 'EXAMPLE 3 (USING SUBSTRING, LOWER CASE)' WRITE '=' #TEXT ASSIGN #START = 13 EXAMINE SUBSTRING(#TEXT,#START,15) TRANSLATE INTO LOWER CASE WRITE '=' #TEXT END
EXAMPLE 1 (USING TRANSLATION TABLE) #TEXT: ABC A B C .A. .B. .C. -A- -B- -C- #TEXT: XYZ X Y Z .X. .Y. .Z. -X- -Y- -Z- EXAMPLE 2 (USING INVERTED TRANSLATION TABLE) #TEXT: XYZ X Y Z .X. .Y. .Z. -X- -Y- -Z- #TEXT: ABC A B C .A. .B. .C. -A- -B- -C- EXAMPLE 3 (USING SUBSTRING, LOWER CASE) #TEXT: ABC A B C .A. .B. .C. -A- -B- -C- #TEXT: ABC A B C .a. .b. .c. -A- -B- -C-
この例では、文字 ä
と ü
を含む Unicode 文字列の分析を示します。 この 2 つの文字は基本文字として定義され、その後に結合文字が続きます。ä
は U+0061
で、その後に U+0308
が続きます。また、ü
のコードは U+0075
で、その後に U+0308
が続きます。
DEFINE DATA LOCAL 1 #U (U20) 1 #START (I2) 1 #POS (I2) 1 #LEN (I2) END-DEFINE #U := U'AB'-UH'00610308'-U'CD'-UH'00750308'-U'EF' * REPEAT #START := #START + 1 EXAMINE #U FOR CHARPOSITION #START CHARLENGTH 1 GIVING POSITION IN #POS LENGTH IN #LEN * INPUT (AD=O) MARK POSITION #POS IN FIELD *#U ' UNICODE-STRING:' #U (AD=MI) // ' CHARACTER NO.:' #START (EM=9) / 'STARTS AT BYTE POSITION:' #POS (EM=9) / ' AND THE LENGTH IS:' #LEN (EM=9) WHILE #POS NE 0 END-REPEAT END
出力:
メインフレーム環境: | Windows、UNIX、および OpenVMS 環境(Natural Web I/O インターフェイスでの出力): |
---|---|
UNICODE-STRING: ABa?CDu?EF CHARACTER NO.: 1 STARTS AT BYTE POSITION: 1 AND THE LENGTH IS: 1 |
UNICODE-STRING: ABäCDüEF CHARACTER NO.: 1 STARTS AT BYTE POSITION: 1 AND THE LENGTH IS: 1 |
Enter キーを押して続行します。 | Enter キーを押して続行します。 |
UNICODE-STRING: ABa?CDu?EF CHARACTER NO.: 2 STARTS AT BYTE POSITION: 2 AND THE LENGTH IS: 1 |
UNICODE-STRING: ABäCDüEF CHARACTER NO.: 2 STARTS AT BYTE POSITION: 2 AND THE LENGTH IS: 1 |
Enter キーを押して続行します。 | Enter キーを押して続行します。 |
位置 3 にある文字は結合文字シーケンスで、コード単位 2 個分の長さがあることに注意してください。 | |
UNICODE-STRING: AB<b>a</b>?CDu?EF CHARACTER NO.: 3 STARTS AT BYTE POSITION: 3 AND THE LENGTH IS: 2 |
UNICODE-STRING: AB<b>ä</b>CDüEF CHARACTER NO.: 3 STARTS AT BYTE POSITION: 3 AND THE LENGTH IS: 2 |
以下、同様。 | 以下、同様。 |