UNSTRING ステートメント

UNSTRING ステートメントを使用することによって、送り出しフィールドの中の連続するデータを分割して、 複数の受け取りフィールドに入れることができます。

構文図を読む構文図をスキップする
フォーマット

>>-UNSTRING--identifier-1--------------------------------------->

>--+-------------------------------------------------------------------------------------+-->
   '-DELIMITED--+----+--+-----+--+-identifier-2-+--+-----------------------------------+-'   
                '-BY-'  '-ALL-'  '-literal-1----'  | .-------------------------------. |     
                                                   | V                               | |     
                                                   '---OR--+-----+--+-identifier-3-+-+-'     
                                                           '-ALL-'  '-literal-2----'         

>--INTO--------------------------------------------------------->

   .------------------------------------------------------------------------------------.   
   V                                                                                    |   
>----identifier-4--+---------------------------------+--+-----------------------------+-+-->
                   '-DELIMITER--+----+--identifier-5-'  '-COUNT--+----+--identifier-6-'     
                                '-IN-'                           '-IN-'                     

>--+---------------------------------+-------------------------->
   '-+------+--POINTER--identifier-7-'   
     '-WITH-'                            

>--+--------------------------------+--------------------------->
   '-TALLYING--+----+--identifier-8-'   
               '-IN-'                   

>--+------------------------------------------+----------------->
   '-+----+--OVERFLOW--imperative-statement-1-'   
     '-ON-'                                       

>--+-----------------------------------------------+------------>
   '-NOT--+----+--OVERFLOW--imperative-statement-2-'   
          '-ON-'                                       

>--+--------------+--------------------------------------------><
   '-END-UNSTRING-'   

identifier-1
これは送り出しフィールド を表します。 データは、このフィールドからデータ受け取りフィールド (ID-4) に転送されます。

ID-1 は、英字、英数字、英数字編集、DBCS、国別、または国別編集カテゴリーのデータ項目を参照しなければなりません。

ID-2リテラル-1ID-3リテラル-2
1 つ以上の区切り文字を指定します。

ID-2 および ID-3 は、英字、英数字、英数字編集、DBCS、国別、または国別編集カテゴリーのデータ項目を参照しなければなりません。

リテラル-1 またはリテラル-2 は、英数字、DBCS、または国別カテゴリーでなければなりません。また、ALL というワードで始まる形象定数にすることはできません。

ID-4
1 つ以上の受け取りフィールドを指定します。

ID-4 は、英字、英数字、数字、DBCS、または国別カテゴリーのデータ項目を参照しなければなりません。 参照されるデータ項目が数字カテゴリーの場合は、その PICTURE 文字ストリングにはピクチャー記号 P を含めることはできません。また、USAGE DISPLAY または NATIONAL でなければなりません。

ID-5
ID-4 に関連付けられた区切り文字を受け取るフィールドを指定します。

ID-5 は、英字、英数字、DBCS、または国別カテゴリーのデータ項目を参照しなければなりません。

ID-6
ID-4 へ転送される文字数を入れるフィールドを指定します。

ID-6 は、PICTURE 文字ストリングの中で記号 P を使用しないで定義された整数データ項目でなければなりません。

ID-7
UNSTRING 処理中の相対的文字位置を入れるフィールドを指定します。

ID-7 ストリングの記号 P なしで定義された 整数データ項目である必要があります。

ID-7 は、ID-1 によって参照されるデータ項目内の文字位置数に 1 を加えた値が十分に入るサイズの データ項目として記述する必要があります。
ID-8
処理される区切り文字で区切られているフィールドの数で増分されるフィールドを指定します。

ID-8 は、PICTURE 文字ストリングの中で記号 P を使用しないで定義された整数データ項目でなければなりません。

次の規則が適用されます。

  • ID-4 が USAGE DISPLAY のデータ項目を参照する場合、ID-1ID-2ID-3、および ID-5 も USAGE DISPLAY のデータ項目を参照しなければなりません。また、すべてのリテラルは英数字リテラルでなければなりません。 ALL というワードで始まる形象定数および NULL を除き、任意の形象定数を指定できます。 形象定数は、それぞれ 1 文字の英数字リテラルを表します。
  • ID-4 が USAGE DISPLAY-1 のデータ項目を参照する場合、ID-1ID-2ID-3、および ID-5 も USAGE DISPLAY-1 のデータ項目を参照しなければなりません。また、すべてのリテラルは DBCS リテラルでなければなりません。 形象定数 SPACE が、指定できる唯一の形象定数です。 形象定数は、それぞれ 1 文字の DBCS リテラルを表します。
  • ID-4 が USAGE NATIONAL のデータ項目を参照する場合、ID-1ID-2ID-3、および ID-5 も USAGE NATIONAL のデータ項目を参照しなければなりません。また、すべてのリテラルは国別リテラルでなければなりません。 ALL というワードで始まる形象定数および NULL を除き、任意の形象定数を指定できます。 形象定数は、それぞれ 1 文字の国別リテラルを表します。

カウント・フィールド (ID-6) およびポインター・フィールド (ID-7) は、バイト数ではなく文字位置 (英数字、DBCS、または国別) の数によって増分されます。

UNSTRING ステートメントの実行開始時に、特定のエレメントの 評価または計算が 1 回だけ実行されることを除き、MOVE ステートメントの シリーズを 1 つの UNSTRING ステートメントで置き換えることができます。 詳しくは、UNSTRING ステートメントの実行終了時の値を参照してください。.

移動の規則は、ID-1 のカテゴリーの基本送り出し項目に対する MOVE ステートメントの規則と 同じであり、該当する ID-4 が受け取り項目となります (MOVE ステートメントを参照)。 例えば、ID-1 が DBCS 項目の場合は、DBCS 項目の移動規則が使用されます。

DELIMITED BY 句

この句は、データ転送を制御するデータ内の区切り文字を指定します。

ID-2ID-3リテラル-1、またはリテラル-2 は、それぞれ 1 つの区切り文字を表します。

DELIMITED BY 句を指定していない 場合、 DELIMITER IN 句および COUNT IN 句を指定してはなりません

ALL
任意の区切り文字の複数の連続するオカレンスは、唯一のオカレンスのように扱われます。この 1 つのオカレンスは、区切り文字受け取りフィールド (ID-5) が指定されていれば、そこに移動されます。送り出しフィールド内の区切り文字は、ID-1 と同じ USAGE およびカテゴリーの基本項目として扱われます。この区切り文字は、MOVE ステートメントの規則に従って、現在の区切り文字受け取りフィールドに移動されます。

DELIMITED BY ALL が指定されていない 場合には、いずれかの 区切り文字が 2 つ以上連続して出現すると、現在のデータ受け取りフィールド (ID-4) は、 データ受け取りフィールドの記述に従って、スペースまたは 0 で埋め込まれます。

2 文字以上の区切り文字

2 文字以上の区切り文字は、区切っている文字が以下の両方である場合にのみ、区切り文字として認識されます。

  • 連続している
  • 送り出しフィールドで指定したシーケンス内
2 つ以上の区切り文字

2 つ以上の区切り文字を OR 条件で指定すると、重なり合わないいずれかの区切り文字が現れるたびに、送り出しフィールドで区切り文字として、指定した順序で認識されます。

次に例を示します。

DELIMITED BY "AB" or "BC"

送り出しフィールドに AB または BC が現れると、区切り文字としてみなされます。 ABC が現れると、AB が現れたとみなされます。

INTO 句

この句は、データの移動先フィールドを指定します。

ID-4データ受け取りフィールド を表します。

DELIMITER IN
この句は、区切り文字の移動先フィールドを指定します。

ID-5区切り文字受け取りフィールド を表します。

DELIMITED BY 句を指定していない 場合、DELIMITED IN 句を指定してはなりません

COUNT IN
この句は、検査済み文字位置の数が入れられるフィールドを指定します。

ID-6 は、各データ転送のデータ個数フィールド です。 各フィールドには、この受け取りフィールドへの移動に関して、送り出しフィールド内の 検査済み文字 (区切り文字で終わるか、または送り出しフィールドの終わりで終わる) の 個数が入れられます。 区切り文字はこの個数には含まれません。

DELIMITED BY 句を指定していない 場合、COUNT IN 句を指定してはなりません

POINTER 句

POINTER 句を指定した場合、ポインター・フィールド ID-7 の値は、送り出しフィールドの文字位置が検査されるたびに 1 ずつ増分されます。 UNSTRING ステートメントの実行が完了すると、ポインター・フィールドには、 送り出しフィールド内で検査された文字位置数とその初期値を加えた値が入ります。

この句を指定する場合には、UNSTRING ステートメントの実行を開始する前に、ユーザーはポインター・フィールドを初期化する必要があります。

TALLYING IN 句

TALLYING 句が指定されるときに、領域カウント・フィールド ID-8 には、(UNSTRING ステートメントの実行の終了時に) 受け取り領域が作用したデータ数を初期値に加えた値が入ります。

この句を指定する場合には、UNSTRING ステートメントの実行を開始する前に、ユーザーは領域カウント・フィールドを初期化する必要があります。

ON OVERFLOW 句

次のような場合に、オーバーフロー条件が存在します。

  • ポインター値 (明示的または暗黙的に指定) が 1 より小さい場合。
  • ポインター値 (明示的または暗黙的に指定) が、送り出しフィールドの長さに 等しい値を超える場合。
  • すべてのデータ受け取りフィールドの処理を終えても、送り出しフィールドに 依然として未検査の文字位置がある場合。
オーバーフロー条件が生じる場合

オーバーフロー条件は、次のような操作の結果生じます。

  1. データがそれ以上転送されない。
  2. UNSTRING 操作が終了する。
  3. NOT ON OVERFLOW 句が指定されている場合は、それが無視される。
  4. 制御は UNSTRING ステートメントの最後に移されるか、ON OVERFLOW 句が指定されていれば、命令ステートメント-1 へ移されます。

命令ステートメント-1
オーバーフロー条件を処理するステートメント (複数可)。

制御が命令ステートメント-1 に移された場合、命令ステートメント-1 に指定された各ステートメントの規則に従って、実行が継続されます。 明示的な制御の移動を起こす、プロシージャーのブランチ・ステートメントや条件ステートメントが実行された場合は、制御はそのステートメントの規則に従って移されます。それ以外の場合は、命令ステートメント-1 の実行が完了すると、 制御は UNSTRING ステートメントの終わりに移されます。

オーバーフロー条件が生じない場合

UNSTRING ステートメントの実行中に、オーバーフロー条件を引き起こす 条件が生じないときには、以下のようになります。

  1. データの転送が完了する。
  2. ON OVERFLOW 句が指定されていれば、無視される。
  3. 制御は UNSTRING ステートメントの最後に移されるか、NOT ON OVERFLOW 句が 指定されていれば、命令ステートメント-2 へ移されます。
命令ステートメント-2
生じないオーバーフロー条件を処理するステートメント (複数可)。

制御が命令ステートメント-2 に移された場合、命令ステートメント-2 に指定された各ステートメントの規則に従って、実行が継続されます。 明示的な制御の移動を起こす、プロシージャーのブランチ・ステートメントや条件ステートメントが実行された場合は、制御はそのステートメントの規則に従って移されます。 それ以外の場合は、命令ステートメント-2 の実行が完了すると、 制御は UNSTRING ステートメントの終わりに移されます。

変更の始まりON OVERFLOW 句は送り出しフィールドを調べるために使用できます。 それに対して NOT ON OVERFLOW 句は、オーバーフロー状態が発生しないときの正常実行に使用できます。 オーバーフロー状態が発生しない場合にのみ実行されるプロシージャーを指定する場合は、NOT ON OVERFLOW を組み込む必要があります。 例えば、次のようになっている場合を考えます。
UNSTRING COLOR-LIST
   ...
   ON OVERFLOW
      DISPLAY 'Error: The string is too large'
   NOT ON OVERFLOW      *> Execute when the UNSTRING is successful
      PERFORM SORT-COLORS
END-UNSTRING
変更の終わり

END-UNSTRING 句

この明示的範囲終了符号は、UNSTRING ステートメントの範囲を区切るために使用されます。 END-UNSTRING 句を使用することによって、 条件 UNSTRING ステートメントを他の条件ステートメント内にネストすることができます。 END-UNSTRING 句は、命令 UNSTRING ステートメントと共に使用することもできます。

詳しくは、範囲区切りステートメントを参照してください。.