【COBOL学習|豆知識】COBOLの文字列解析を極める:INSPECT文のBEFORE/AFTER活用術

1. 導入:なぜINSPECTの範囲指定が重要なのか

COBOLで文字列を扱う際、特定の区切り文字(デリミタ)を目印にして処理を行いたい場面は多々あります。例えば、「CSV形式のレコードから特定の項目を抽出する」あるいは「ログデータの特定の識別子以降の数値だけをカウントする」といったケースです。単に文字列全体を走査するのではなく、特定の範囲に限定して操作することで、不必要な誤検知を防ぎ、プログラムの堅牢性を高めることができます。今回は、INSPECT文の強力なオプションであるBEFORE/AFTERを用いたデータ操作の作法を解説します。

2. 基礎知識:INSPECT文と範囲指定の仕組み

INSPECT文は、文字列中の文字をカウント(TALLYING)したり、置換(REPLACING)したりするための命令です。ここに「BEFORE」や「AFTER」を加えることで、操作対象を「ある文字が現れる前まで」あるいは「ある文字が現れた後から」に限定できます。
BEFOREは、指定した文字に到達した時点でカウントを停止します。
AFTERは、指定した文字を通過した直後からカウントを開始します。
これらを組み合わせることで、文字列内の動的な構造をピンポイントで制御することが可能になります。

3. 実装と解決策

文字列が「ID=001:VAL=999」のように、コロンを区切りとして構成されている場合を考えます。「VAL=」の後に続く数値を正確に特定するには、単に数値を探すだけでは前方のID値と混同するリスクがあります。ここで「AFTER “:”」を指定することで、コロン以降のみを対象にすることができ、論理エラーを未然に防ぐことができます。

4. サンプルプログラム

以下は、特定の区切り文字「:」の後ろにある数値の個数をカウントするサンプルです。

IDENTIFICATION DIVISION.
PROGRAM-ID. INSPECT-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 STR-DATA PIC X(20) VALUE “ID:123:VAL:45678”.
01 TARGET-COUNT PIC 9(02) VALUE 0.

PROCEDURE DIVISION.
MAIN-PROCEDURE.

  • “:” の後に現れる “5” の個数をカウントする例

MOVE 0 TO TARGET-COUNT.

  • AFTER “:” を指定することで、最初のコロンより前は無視される

INSPECT STR-DATA TALLYING TARGET-COUNT
FOR ALL “5” AFTER “:”.

DISPLAY “カウント結果: ” TARGET-COUNT.

STOP RUN.

5. 応用・注意点:現場で陥りやすい罠

実務で最も注意すべき点は、「指定した区切り文字自体はカウント対象外になる」という仕様です。また、もし指定した文字が文字列内に存在しない場合、BEFOREであれば「文字列全体」が対象となり、AFTERであれば「一切の操作が行われない」という挙動になります。
現場では、「データが存在しないケース(区切り文字が欠落している場合)」を想定し、事前にIF文で区切り文字の有無をチェックする、あるいはINSPECT実行後に結果が期待値通りか確認するロジックを必ず組み込んでください。この一手間が、保守性の高いCOBOLコードを作るための重要な作法となります。

コメント

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