- 「メインフレーム・コンピューター」で遊ぼう - http://www.arteceed.net -

CLIST入門(5)

CLIST入門(5):文字列の処理

CLISTでは文字列の取り扱いが多くなります。反復するTSOコマンドのパラメーターを生成したり、入力データや読み込んだレコード内に含まれている特定の文字列を探索したり、などです。
CLISTにはいくつかの文字列処理用の関数が用意されています。


&LENGTH:文字列の長さを得る

&LENGTHによって、変数内の文字列の長さを求めることができます。文字列の長さ分、処理を繰り返すような場合に利用できます。

----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
SET MSG = &STR(  HELLO !!! )       変数MSGに「  HELLO !!! 」をセット
SET TXTLNG = &LENGTH(&MSG)         変数TXTLNGに変数MSG内の文字列の長さをセット
                                   (先行および後続ブランクの長さは含まれない)
SET TXTLNG = &LENGTH(&STR(&MSG))   変数TXTLNGに変数MSG内の文字列の長さをセット
                                   (先行および後続ブランクの長さも含まれる)

&SYSINDEX:文字列内の検索

&SYSINDEXは、ある文字ストリングが他の文字ストリングの中のどこで始まっているかの位置を知らせます。これはマニュアルの説明のままですが、要するに文字列内にある特定の文字列をさがして、それが文字列内のどこから始まっているかを教えてくれます。変数Aに「REDBLUEYELLOW」というデータが入っているとき、その中にBLUEという文字列があるなら、その開始位置を求めたい、といった場合に利用します。

----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
SET TEXT = REDBLUEYELLOW             変数TEXTに「REDBLUEYELLOW」をセット
SET LOCATION = &SYSINDEX(BLUE,&TEXT) 変数内の文字列「BLUE」を探し、見つかったら
                                     その開始位置を変数LOCATIONに入れる

探索した文字列が見つからない場合、関数&SYSINDEXは0を返します。先頭で見つかると1が返ります(1桁目で見つかった)。

探索開始位置を先頭ではなく途中からにしたい場合は、開始位置を即値か変数で次のように3番目のパラメーターとして指定します。

----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
SET START = 6                               探索開始位置をセット
SET LOCATION = &SYSINDEX(BLUE,&TEXT,&START) 変数TEXTの途中から探索

&SYSINDEXでは、探索される文字列と探索する文字列のいずれにもDBCS文字を使用することができます。「赤青黄色」の中から「青」を探すと結果として2が返ります。つまり2文字目ということです。バイト位置では3桁目となるのでしょうが、DBCSが含まれると文字列のバイト数とはずれてきます。また実際のバイト列の中にはSO/SIコードも含まれます。文字として何文字目に見つかったかが返ることを知っておきます。DBCSとSBCSの混合文字列も処理できます。詳細はマニュアルに解説されています。


&SUBSTR:文字列の一部を取り出す

&SUBSTRによって、文字列の中の一部分を取り出すことができます。&SYSINDEXとの組み合わせで使われることも多く、特定の文字列を探し、見つかったらその部分を取り出して別の変数に移す、といった場合に利用できます。

----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
SET TEXT = REDBLUEYELLOW
SET LOCATION = &SYSINDEX(BLUE,&TEXT)
SET COLOR = &SUBSTR(&LOCATION:&LOCATION+3,&TEXT)  変数TEXTの中に含まれている
                                   文字列BLUEを取り出して、変数COLORに入れる

次は少し実践的なサンプルで、RACFのLISTUSERコマンドで返されるリストから、ユーザーIDに登録された名前を取り出すものです。

----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
PROC 0                                                              
SET &SYSOUTTRAP = 1                            /* TRAP 8LINE MSGS */
LISTUSER                                       /* ISSUE RACF CMD  */
SET &SYSOUTTRAP = 0                            /* RESET MSG TRAP  */
SET LOC0 = &SYSINDEX(NAME=,&STR(&SYSOUTLINE1)) /* FIND 'NAME='    */
SET BLANK = &STR(  )                           /* SET USER NAME   */
SET LOC1 = &LOC0 + 5                           /*  FROM RACF LIST */
SET LOC2 = &SYSINDEX(&BLANK,&STR(&SYSOUTLINE1),&LOC0)               
SET USERNAME = &SUBSTR(&LOC1:&LOC2-1,&SYSOUTLINE1)                  
SET USERNAME_LENGTH = &LENGTH(&STR(&USERNAME))                      

変数USERNAMEにLISTUSERコマンドのリストに含まれるNAME=の値が、
変数USERNAME_LENGTHに取り出した名前の長さが入る

&SUBSTRも漢字を含むDBCS文字列の処理も可能ですが、DBCSの場合は&SUBSTRに代えて&SYSCSUBSTRが利用できます。&SYSCSUBSTRはDBCSを1文字として計算します。詳細はマニュアルに解説されています。


&NRSTR:二重アンパーサンドの処理

&&のように&記号を2つ続けて文字列として変数内に格納したい場合があります。例えばJCLで使用する一時的データセット名などを生成したい場合です。この場合は&STRに代えて&NRSTR関数を利用できます。

----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
SET FILENAME = &STR(&&TEMP)        これではだめ
SET FILENAME = &NRSTR(&&TEMP)      FILENAMEには「&TEMP」がセットされる
SET FILENAME = &NRSTR(&&&&TEMP)    FILENAMEには「&&TEMP」がセットされる
                              (&&&TEMPではなく、&&&&TEMPとすることがポイント)

他にも、&DATATYPE(変数内のデータタイプの判定)、&SYSCAPSと&SYSLC(大文字・小文字変換)、&SYSONEBYTEと&SYSTWOBYTE(全角・半角変換)などがあります。