【COBOL学習|初心者向け】COBOL技術者が教える!UNSTRING … POINTER句で複雑な文字列解析をスマートにこなす方法

なぜ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文等でチェックする癖をつけましょう。また、ログ解析などで「特定のキーワードが出現したときだけ別の処理に切り替える」といった条件分岐と組み合わせると、非常に強力な解析ツールが出来上がります。ぜひ試してみてください。

コメント

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