なぜPOINTER句が必要なのか?
COBOLで文字列を分解する際、通常はUNSTRING文を一度だけ使って終わりにしてしまいがちです。しかし、CSVデータやログファイルのように、データ構造が複雑だったり、可変長だったりする場合、一度の命令ですべてを処理するのは困難です。そんな時に役立つのがPOINTER句です。これを使うと、文字列の「どこまで解析したか」という位置情報を保持でき、複数回に分けて安全かつ柔軟にデータを切り出すことが可能になります。
基礎知識:UNSTRINGとPOINTERの仕組み
UNSTRINGは、文字列を区切り文字(DELIMITER)に基づいて分解する命令です。通常、UNSTRINGは文字列の先頭から開始されますが、POINTER句を指定すると、解析開始位置をプログラム側で制御できるようになります。
POINTER句で指定するデータ項目には、「次に解析を開始すべき位置(添字)」を保持させます。UNSTRINGが実行されるたびに、この値は自動的に更新されるため、次のUNSTRING文では「前回の続き」から処理を再開できるのです。
実装のステップ
1. 解析対象の文字列を定義する。
2. ポインタ用の数値項目(PIC 9(4)等)を定義し、初期値として「1」をセットする。
3. UNSTRING文にPOINTER句を加え、対象文字列とポインタを指定する。
4. 必要な分だけ解析を繰り返す。
サンプルプログラム
以下のコードは、ハイフンで区切られた複雑な文字列から、段階的にデータを抽出する例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. POINTER-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- 解析対象の文字列
01 WS-TARGET-DATA PIC X(30) VALUE “ABC-123-XYZ-999”.
- ポインタ用の項目(初期値は1)
01 WS-PTR PIC 9(02) VALUE 1.
- 切り出し結果格納用
01 WS-PART-1 PIC X(05).
01 WS-PART-2 PIC X(05).
PROCEDURE DIVISION.
- 1回目の解析:最初のハイフンまでを切り出し
UNSTRING WS-TARGET-DATA
DELIMITED BY “-”
INTO WS-PART-1
WITH POINTER WS-PTR
END-UNSTRING.
DISPLAY “1回目: ” WS-PART-1
- 2回目の解析:前回の続きから次のハイフンまでを切り出し
UNSTRING WS-TARGET-DATA
DELIMITED BY “-”
INTO WS-PART-2
WITH POINTER WS-PTR
END-UNSTRING.
DISPLAY “2回目: ” WS-PART-2
- ポインタの現在地を確認
DISPLAY “現在のポインタ位置: ” WS-PTR
STOP RUN.
応用と注意点
現場で最も注意すべき点は、ポインタ値の管理です。UNSTRINGを実行するたびに、ポインタ値は「解析した文字数+1」の分だけ自動的に進みます。もしポインタの値が文字列の長さを超えてしまうと、プログラムが異常終了したり、意図しない動作を招いたりする可能性があります。
必ず、解析のループを回す際には、ポインタの値が文字列の長さを超えていないか、IF文等でチェックする癖をつけましょう。また、ログ解析などで「特定のキーワードが出現したときだけ別の処理に切り替える」といった条件分岐と組み合わせると、非常に強力な解析ツールが出来上がります。ぜひ試してみてください。

コメント