【COBOL学習|実務向け】COBOL文字列解析の奥義:INSPECT文による範囲指定カウントの最適化

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

現場の基幹システムで、テキストデータから「特定の区切り文字(例:括弧内など)の中に含まれる特定の文字数」をカウントしたいという要件は頻繁に発生します。これを愚直にループとサブストリング(参照修飾)で実装すると、添字の計算ミスや無限ループのリスクが伴います。COBOLのINSPECT文は、OSやコンパイラに最適化された強力なツールです。特にBEFORE/AFTER句を組み合わせることで、複雑な条件判定をわずか1行で記述でき、保守性と信頼性を劇的に向上させることが可能です。

基礎知識:INSPECT TALLYINGの仕組み

INSPECT文は、文字列をスキャンして特定の文字を計数・置換するための命令です。
TALLYING句は「計数」を行います。ここで重要なのが「対象範囲」の絞り込みです。

  • AFTER “A”:文字”A”が出現した「後」からスキャンを開始する
  • BEFORE “B”:文字”B”が出現する「前」でスキャンを終了する

これらを組み合わせることで、特定のデリミタ(区切り文字)に囲まれた領域のみを対象に解析が可能となります。

実装:論理的な構成手順

範囲指定を正しく行うためには、以下の点に注意が必要です。
1. 解析対象の文字列が、指定したデリミタを含んでいるか確認する。
2. 複数の条件を組み合わせる際は、左から右へ順次評価される仕様を理解する。
3. カウンタ用変数(数値項目)は、使用前に必ずゼロクリアする。

サンプルプログラム

以下は、文字列「(A-B-C-D)」のようなデータから、括弧内にあるハイフン「-」の数をカウントする実例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. INSPECT-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TARGET-STR PIC X(20) VALUE “(A-B-C-D)”.
01 WS-COUNT PIC 9(02) VALUE 0.

PROCEDURE DIVISION.
> 1. カウンタを初期化
MOVE 0 TO WS-COUNT.

> 2. INSPECTによる範囲指定カウント
> 括弧”(” の後ろから、括弧”)” の前までの範囲で、
> “-” (ハイフン)の出現回数を数える
INSPECT WS-TARGET-STR
TALLYING WS-COUNT FOR ALL “-”
AFTER “(”
BEFORE “)”.

> 3. 結果表示(デバッグ用)
DISPLAY “対象文字列: ” WS-TARGET-STR.
DISPLAY “カウント結果: ” WS-COUNT.

GOBACK.

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

1. デリミタが存在しない場合
指定したBEFOREまたはAFTERの区切り文字が文字列内に存在しない場合、INSPECT文はその条件を無視してスキャンを継続します。予期せぬカウントを防ぐため、事前にIF文等で区切り文字の存在有無をチェックする運用を推奨します。

2. 性能への配慮
INSPECT文は非常に高速ですが、極端に長い文字列(数MB以上)に対して高頻度で実行する場合は、バッファサイズとスキャン範囲を意識してください。

3. 複雑な入れ子構造の限界
もし「((A-B)-C)」のように括弧が入れ子になっている場合、単一のINSPECT文では対応できません。その場合は、一度括弧の位置をSEARCH文やループで特定し、対象範囲を絞ってからINSPECTを適用する「段階的処理」に切り替えるのが、バグを生まないための賢明な判断です。

コメント

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