【COBOL学習|豆知識】COBOL流・可変長データのスマートな捌き方:POINTER句を活用したUNSTRING制御術

導入:なぜPOINTER句が必要なのか

COBOLでの文字列処理といえばSTRING文やUNSTRING文が定番ですが、特にCSV形式のように「要素数が不定のデータ」を扱う際、頭を悩ませるのがスキャン位置の管理です。通常、UNSTRING文は文字列の先頭から処理を開始しますが、POINTER句を組み合わせることで、プログラム自身が「今どこまで読み込んだか」を数値として保持できるようになります。これにより、複雑なフラグ制御なしで、ループ処理と組み合わせた柔軟なデータ抽出が可能になります。

基礎知識:POINTER句の仕組み

UNSTRING文におけるPOINTER句は、スキャンを開始する位置を制御する「カーソル」のような役割を果たします。
通常、POINTERを省略すると常に先頭から解析されますが、POINTERを指定すると、その変数の値が現在の読み込み開始位置として参照されます。重要なのは、UNSTRING文が実行されるたびに、このポインタ変数の値が自動的に更新されるという点です。この仕組みを利用すれば、PERFORM文で反復処理を行うだけで、文字列の終わりまで順番に要素を切り出すことができます。

実装:論理的なアプローチ

1. ポインタ用の数値項目(PIC 9(4)など)を定義し、初期値に「1」をセットします。
2. PERFORM UNTIL文で、ポインタ変数が文字列の長さを超えるまで繰り返します。
3. ループ内でUNSTRING文を実行し、POINTER句にポインタ変数を指定します。
4. 全要素を読み終えると、ポインタ変数は次の開始位置を指し示し続けます。エラーチェックや終了条件の判定には、このポインタ値を利用するのが定石です。

サンプルプログラム

以下のコードは、カンマ区切りの文字列をループで順番に切り出す例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-UNSTRING.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATA PIC X(50) VALUE ‘APPLE,ORANGE,BANANA,GRAPE’.
01 WS-LEN PIC 9(02) VALUE 25.
01 WS-PTR PIC 9(03) VALUE 1.
01 WS-ITEM PIC X(10).

PROCEDURE DIVISION.
MAIN-PROCEDURE.
> ポインタがデータ長より小さい間、繰り返し処理を行う
PERFORM UNTIL WS-PTR > WS-LEN
INITIALIZE WS-ITEM

> POINTER句で現在の位置を指定して切り出し
UNSTRING WS-DATA DELIMITED BY ‘,’
INTO WS-ITEM
POINTER WS-PTR
END-UNSTRING

> 抽出した結果を表示(空白はトリミング対象)
IF WS-ITEM NOT = SPACES
DISPLAY ‘抽出された要素: ‘ FUNCTION TRIM(WS-ITEM)
END-IF
END-PERFORM.

STOP RUN.

応用・注意点:現場での落とし穴

実務でPOINTER句を使う際、最も注意すべきは「ポインタ変数の初期化忘れ」「終了条件の誤り」です。
特に、UNSTRING文の実行後、ポインタ変数は「次に読み込むべき位置」を指すため、文字列の末尾を超えた値になることがあります。PERFORMの終了条件(UNTIL)を適切に設定しないと、意図しない無限ループや領域外参照を引き起こすリスクがあります。また、対象文字列の長さ(LENGTH OF)を動的に取得して判定条件に組み込むと、より堅牢でメンテナンス性の高いコードになります。複雑なパース処理こそ、このポインタ制御でシンプルに書き換えてみてください。

コメント

タイトルとURLをコピーしました