【初心者向け】COBOLの「INSPECT文」とは?基本から使い方まで徹底解説!

2025年4月10日木曜日

COBOL

「このデータの中にある特定の文字、いくつあるか数えたいな…」
「この部分の文字を、別の文字に全部変えたいんだけど、どうやるのがスマートかな?」

そんな時に頼りになるのが、COBOLに用意されている「INSPECT文(インスペクト)」なんです!

こいつを使えば、文字列の中身を調べたり、特定の文字を数えたり、別の文字に置き換えたりする作業が、びっくりするほど簡単にできちゃいます。

この記事では、COBOL初心者の方に向けて、謎多き(?)INSPECT文の正体を暴き、その基本的な使い方から、ちょっとした応用テクニックまで、余すところなくお伝えしていきます。


この記事でわかること

  • INSPECT文って、そもそも何をするための命令なの?
  • 基本的な書き方、構文のルール
  • 文字の数を数える「TALLYING」の使い方
  • 文字を置き換える「REPLACING」の使い方
  • 使うときに気をつけたいポイントや、よくあるミス
  • INSPECT文の便利な活用アイデア

COBOLの「INSPECT文」とは?文字列操作の基本を理解しよう

まず、INSPECT文が一体何者なのか、その役割から見ていきましょう。

簡単に言うと、INSPECT文は「文字列データの中身を検査(Inspect)して、いろいろ操作するための命令」です。

例えば、こんなことができます。

  • ある文字列の中に、特定の文字(例えば'A'とか'-'とか)が何個含まれているか数える。
  • ある文字列の中の、特定の文字を、別の文字に一括で置き換える。(例えば、'-'を全て'/'に変えるとか)
  • ある文字列の中に、特定のパターンの文字列があるかチェックする。

これらを、もしINSPECT文なしでやろうとすると、ループ処理を使って一文字ずつ比較したり、複雑なロジックを組んだりする必要が出てきます。それはそれで勉強にはなりますが、コードが長くなったり、読みにくくなったりしがちなんですよね。

そこでINSPECT文の出番!

INSPECT文を使えば、そういった文字列操作を、たった1文で、スッキリと記述できるようになります。結果として、プログラムがシンプルになり、他の人が読んでも理解しやすくなる、という大きな利点があるわけです。

まさに、面倒な文字列作業を肩代わりしてくれる、頼もしい助っ人という感じですね!

「INSPECT文」の基本的な書き方(構文)

では、具体的にINSPECT文をどうやって書くのか、基本的なルールを見ていきましょう。
一番シンプルな骨格はこんな感じです。

INSPECT 対象項目 操作内容...

順番に見ていきますね。

「INSPECT」
まず、お約束として「これからINSPECT文を使いますよ」という宣言をします。

「対象項目」
次に、「どのデータの中身を調べますか?」という、操作のターゲットを指定します。ここには、文字列データが入っている変数名(データ項目名)を書きます。

例えば、社員名が入っている変数とか、商品コードが入っている変数とかですね。基本的には、文字タイプのデータ項目(英数字項目など)を指定します。

「操作内容...」
そして最後に、「その対象項目に対して、具体的に何をしますか?」という操作の内容を書いていきます。ここがINSPECT文のキモとなる部分で、主に次の2つの機能があります。

  • TALLYING(タリーイング) 特定の文字を数える機能
  • REPLACING(リプレイシング) 特定の文字を置き換える機能

これらの機能は、単独で使うこともできますし、組み合わせて使うことも可能です。

もちろん、それぞれの機能には、さらに細かいオプションが用意されていて、それらを指定することで、より複雑な操作も実現できます。そのあたりは、次の章から詳しく見ていきましょう!

まずは、「INSPECT データ項目名 やりたいこと」という基本の形を覚えておいてくださいね。

「INSPECT文」の使い方①:文字の出現回数を数える (TALLYING)

さっそくINSPECT文の主要機能の一つ、「TALLYING(タリーイング)」の使い方を見ていきましょう!

TALLYINGは、指定した文字列データ項目の中に、特定の文字や文字列が何回出現するかを数えてくれる機能です。データチェックなどで、特定の記号の数を数えたい時なんかに便利ですよ。

基本的な書き方はこんな感じです。

INSPECT 対象項目
    TALLYING 計数項目 FOR オプション '数えたい文字'.

「TALLYING 計数項目 FOR」

「これから数えますよ(TALLYING)、数えた結果はこの変数(計数項目)に入れてね、数えるルール(FOR以降)はこうだよ」という意味になります。

「計数項目」には、カウント結果を格納するための数字タイプの変数名(データ項目名)を指定します。この計数項目は、使う前に必ずゼロで初期化しておくのを忘れないでくださいね!

「オプション '数えたい文字'」
ここで、「何を」「どのように」数えるかを指定します。

  • ALL '文字' 指定した'文字'が全部で何個あるか数える
  • LEADING '文字' 文字列の先頭から連続している指定した'文字'を数える
  • CHARACTERS 文字の種類ごとに数える(ちょっと特殊な使い方)

まずは `ALL` を使って、特定の文字が全体でいくつあるか数える、という使い方を覚えるのが良いでしょう。

では、実際のプログラム例を見てみましょう。

TALLYINGのサンプルプログラム

例えば、'ABC-ABC-ABC' という文字列の中に、ハイフン '-' が何個あるか数えてみましょう。

IDENTIFICATION DIVISION.
PROGRAM-ID. INSPECT-TALLY-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TARGET-STR PIC X(12) VALUE 'ABC-ABC-ABC'.
01 WS-COUNT      PIC 9(3)  VALUE ZERO. *> 結果を入れる変数(初期化!)

PROCEDURE DIVISION.
MAIN-PROC.
*>-- 対象文字列を表示
    DISPLAY '対象文字列: ' WS-TARGET-STR

*>-- INSPECT文で'-'の数を数える
    INSPECT WS-TARGET-STR
        TALLYING WS-COUNT FOR ALL '-'. *> ここがポイント!

*>-- 結果を表示
    DISPLAY 'ハイフンの数: ' WS-COUNT

    STOP RUN.

このプログラムを実行すると、こんな結果が表示されるはずです。

対象文字列: ABC-ABC-ABC
ハイフンの数: 002

ちゃんと、ハイフンが2個あることを数えてくれましたね!


`WORKING-STORAGE SECTION` で、調べたい文字列を入れる変数 `WS-TARGET-STR` と、結果を格納するカウンター用の変数 `WS-COUNT` を定義しています。`WS-COUNT` に `VALUE ZERO` を付けてゼロで初期化しているのがミソです。

`PROCEDURE DIVISION` では、まず元の文字列を表示し、次に `INSPECT` 文を実行しています。`INSPECT WS-TARGET-STR TALLYING WS-COUNT FOR ALL '-'` で、「`WS-TARGET-STR` の中にある、全ての(ALL)ハイフン('-')の数を数えて、その結果を `WS-COUNT` に入れてね」と命令しているわけです。

最後に、結果の入った `WS-COUNT` を表示しています。簡単でしょう?

TALLYINGのオプション解説 (ALL, LEADING, CHARACTERS)

先ほどのサンプルでは `ALL` オプションを使いましたが、TALLYINGには他にも便利なオプションがあります。主なものを紹介しますね。

  • ALL '文字'
    これは先ほど使ったもので、文字列全体を対象にして、指定した'文字'が合計で何個出現するかを数えます。一番よく使うオプションかもしれません。

  • LEADING '文字'
    これは、文字列の先頭から見て、指定した'文字'が連続していくつ出現するかを数えます。途中で違う文字が出てきたら、そこでカウントはストップします。例えば、数字の前のゼロ埋め('000123')のゼロの数を数えたい時なんかに使えますね。

  • CHARACTERS
    これは少し特殊で、指定した条件(例えば `BEFORE INITIAL ' '` で最初のスペースが現れるまで、など)に合致する文字数をカウントします。特定の区切り文字までの文字数を数えたい場合などに使えます。

さらに、`BEFORE INITIAL '区切り文字'` や `AFTER INITIAL '区切り文字'` といった句を追加することで、「特定の文字が現れる前まで」や「特定の文字が現れた後から」といった、カウントする範囲を限定することも可能です。例えば、「最初のスペースが出てくるまでの、'A'の数を数える」なんてこともできるんです。

これらのオプションを使い分けることで、より細かい条件での集計が可能になります。 最初は `ALL` だけでも十分ですが、慣れてきたら他のオプションも試してみると、INSPECT文の便利さがさらに実感できるはずです!

「INSPECT文」の使い方②:文字を置き換える (REPLACING)

次に、INSPECT文のもう一つの花形機能、「REPLACING(リプレイシング)」を見ていきましょう!

REPLACINGは、その名の通り、指定した文字列データ項目の中にある特定の文字や文字列を、別の文字や文字列に置き換えてくれる機能です。データのフォーマットを整えたり、不要な文字を削除(スペースに置き換えたり)するのに役立ちます。

基本的な書き方はこちら。

INSPECT 対象項目
    REPLACING オプション '置き換え前の文字' BY '置き換え後の文字'.

「REPLACING ... BY ...」
「これから置き換えますよ(REPLACING)、この文字を(置き換え前の文字)、この文字で(BY 置き換え後の文字)ね」という意味合いです。

「オプション」
TALLYINGと同じように、どのように置き換えるかを指定するオプションがあります。

  • ALL '文字' 指定した'文字'を全て置き換える
  • LEADING '文字' 文字列の先頭から連続している指定した'文字'を置き換える
  • FIRST '文字' 最初に見つかった指定した'文字'だけを置き換える
  • CHARACTERS BY '文字' 条件に合う文字を指定した'文字'で置き換える

こちらもまずは `ALL` を使って、特定の文字を根こそぎ置き換える、という使い方から試してみるのがおすすめです。

では、REPLACINGの具体的なプログラム例を見てみましょう。

REPLACINGのサンプルプログラム

例えば、'ID: A001 / NAME: SUZUKI' という文字列の中の、スラッシュ '/' をハイフン '-' に置き換えてみましょう。

IDENTIFICATION DIVISION.
PROGRAM-ID. INSPECT-REPLACE-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATA-LINE  PIC X(25) VALUE 'ID: A001 / NAME: SUZUKI'.

PROCEDURE DIVISION.
MAIN-PROC.
*>-- 置き換え前の文字列を表示
    DISPLAY '置き換え前: ' WS-DATA-LINE

*>-- INSPECT文で'/'を'-'に置き換える
    INSPECT WS-DATA-LINE
        REPLACING ALL '/' BY '-'. *> ここがポイント!

*>-- 置き換え後の文字列を表示
    DISPLAY '置き換え後: ' WS-DATA-LINE

    STOP RUN.

実行結果はこうなります。

置き換え前: ID: A001 / NAME: SUZUKI
置き換え後: ID: A001 - NAME: SUZUKI

見事にスラッシュがハイフンに置き換わりましたね!

プログラムの構造はTALLYINGの時と似ています。`WORKING-STORAGE SECTION` で操作対象の文字列変数 `WS-DATA-LINE` を定義。`PROCEDURE DIVISION` で、まず置き換え前のデータを表示し、次に `INSPECT WS-DATA-LINE REPLACING ALL '/' BY '-'.` を実行しています。

これで「`WS-DATA-LINE` の中にある、全てのスラッシュ('/')を、ハイフン('-')で置き換えてね(REPLACING ALL ... BY ...)」と命令しています。最後に、書き換わった `WS-DATA-LINE` の中身を表示しています。

注意点として、REPLACINGを使うと、元の変数(この例では`WS-DATA-LINE`)の中身が直接書き換えられます。 元のデータを残しておきたい場合は、別の変数にコピーしてからINSPECT文を実行するようにしましょう。

REPLACINGのオプション解説 (ALL, LEADING, FIRST, CHARACTERS)

REPLACINGにも、TALLYINGと同じようにいくつかのオプションがあります。状況に応じて使い分けると、とても便利ですよ。

  • ALL '置換前文字' BY '置換後文字'
    サンプルで使ったのがこれですね。文字列全体を見て、指定した'置換前文字'をすべて'置換後文字'に置き換えます。一番使う頻度が高いかもしれません。

  • LEADING '置換前文字' BY '置換後文字'
    文字列の先頭から連続している'置換前文字'だけを'置換後文字'に置き換えます。例えば、先頭の不要なスペースを削除したい(スペースを空文字や別の文字に置き換えたい)場合などに使えます。

  • FIRST '置換前文字' BY '置換後文字'
    文字列の中で、最初に見つかった'置換前文字'だけを'置換後文字'に置き換えます。2つ目以降は置き換えません。特定の区切り文字のうち、最初のものだけ別の記号に変えたい、といった場合に利用できます。

  • CHARACTERS BY '置換後文字'
    これはTALLYINGの `CHARACTERS` と似ていて、`BEFORE INITIAL` や `AFTER INITIAL` と組み合わせて使います。「最初のスペース以降の文字を全て'*'でマスクする」といった、特定の範囲の文字をごっそり置き換えるような処理に使えます。

また、TALLYINGとREPLACINGは、一つのINSPECT文の中で同時に使うこともできるんです!例えば、「'-'の数を数えながら、同時に'/'に置き換える」なんてことも可能です。

その場合は、`INSPECT 対象項目 TALLYING ... REPLACING ...` のように、続けて書くだけです。

目的に合わせて最適なオプションを選ぶことで、文字列操作の幅がぐっと広がります。 いろいろ試して、それぞれのオプションの動きを掴んでみてください!

COBOLの「INSPECT文」の注意点とよくある間違い

とっても便利なINSPECT文ですが、使う上でいくつか気をつけておきたい点や、初心者の人がやりがちなミスがあります。ここでしっかり押さえておきましょう!

操作できるのは文字タイプのデータ!

INSPECT文が操作できるのは、基本的に `PIC X` などで定義された英数字項目や集団項目です。`PIC 9` で定義された数字項目(外部10進や内部10進など)に対しては、そのままでは使えません。

数字項目の中身を調べたい場合は、一度 `MOVE` 命令などで英数字項目に転記してからINSPECT文を使う必要があります。

TALLYINGのカウンター変数は初期化を忘れずに!

これはTALLYINGのところでも触れましたが、超が付くほど大事な点です。数を数えるための変数(計数項目)は、`INSPECT`文を実行する前に必ず `VALUE ZERO` や `INITIALIZE` 命令でゼロにしておきましょう。 

初期化を忘れると、前に使った時の値が残っていて、意図しないカウント結果になってしまいます。よくあるミスの代表格ですよ!

REPLACINGでの文字長の変化に注意

REPLACINGで、置き換え前の文字と置き換え後の文字の長さが違う場合(例えば、1文字の'-'を2文字の'//'に置き換えるなど)、COBOLのバージョンやコンパイラによってはエラーになったり、意図しない動きになったりすることがあります。

基本的には、同じ長さの文字で置き換えるのが安全です。もし文字長を変えたい場合は、注意が必要ですし、別の方法(部分参照や文字列連結など)を検討した方が良いケースもあります。

パフォーマンスについて

INSPECT文は非常に便利ですが、非常に巨大なデータ項目に対して複雑なTALLYINGやREPLACINGを何度も行うような場合、処理に時間がかかる可能性もゼロではありません。

特にループの中で毎回INSPECT文を実行するようなケースでは、処理速度への影響も少しだけ頭に入れておくと良いでしょう。 とはいえ、ほとんどの場合は、自分でループを組むよりINSPECT文を使った方が簡潔で効率的なことが多いです。

細かい文法ミス

ピリオドの位置を間違えたり、`TALLYING` や `REPLACING` などの予約語のスペルを間違えたり、といった基本的なミスも、慣れないうちは起こりがちです。

エラーが出たら、まずは落ち着いて、記述が正しいか見直してみましょう。

これらの点を意識しておけば、INSPECT文をより安全かつ効果的に使いこなせるようになりますよ!

「INSPECT文」の便利な使い方(応用例)

基本的な使い方と注意点がわかったところで、INSPECT文のちょっと便利な応用例をいくつか紹介しましょう。「へぇ、こんなことにも使えるんだ!」と思ってもらえたら嬉しいです。

入力データの簡易チェック

ユーザーが入力したデータや、外部ファイルから読み込んだデータに、使ってはいけない文字(例えば、半角カナとか特定の記号とか)が含まれていないかチェックしたい時。

INSPECT文のTALLYING機能で、禁止文字の数を数えて、もしカウントがゼロより大きかったらエラーにする、といった使い方ができます。`INSPECT INPUT-DATA TALLYING WS-ERR-COUNT FOR ALL '禁止文字'.` のような感じですね。

日付やコードのフォーマット変換

例えば、'20250411' という形式の日付データを、'2025/04/11' というようにスラッシュ区切りで見やすく表示したい時。普通なら部分参照などで分解して編集しますが、もし元のデータが `PIC X` で定義されていれば、`REPLACING` を使って区切り文字を一括で挿入する、といった荒業(?)も場合によっては可能です。(ただし、これは少しトリッキーなので、通常は編集機能を使う方が一般的です)。

もっと現実的なのは、'CODE-A' と 'CODE-B' のようにハイフン区切りになっているコードを、ハイフンなしの 'CODEAB' に統一したい場合など。`INSPECT WORK-CODE REPLACING ALL '-' BY ''.` (置き換え後を空文字にするイメージ ※ただし、COBOLの仕様によっては空文字指定ができない場合もあるので注意)のような形で、特定の記号を削除する目的で使えます。

複数条件の組み合わせ

一つのINSPECT文で、TALLYINGとREPLACINGを組み合わせることもできます。例えば、「データ中の全角スペースを数えつつ(TALLYING)、半角スペースに置き換える(REPLACING)」といった処理を一度に行えます。コードがスッキリしますね。

これらはほんの一例で、INSPECT文はアイデア次第で本当に色々な場面で役立ちます。 データの内容をチェックしたり、整形したりする作業が出てきたら、「これ、INSPECT文で楽にできないかな?」と考えてみる癖をつけると、COBOLプログラミングがもっと楽しく、効率的になりますよ!

【まとめ】INSPECT文をマスターしてCOBOLプログラミングを効率化しよう

さて、今回はCOBOLの強力な武器、「INSPECT文」について、基本的なところから応用例、注意点まで詳しく見てきました。ポイントをまとめておきましょう!

  • INSPECT文は、文字列の中身を検査、集計(TALLYING)、置換(REPLACING)するための命令。
  • TALLYINGを使えば、特定の文字がいくつあるか簡単に数えられる。
  • REPLACINGを使えば、特定の文字を別の文字にサッと置き換えられる。
  • 対象は文字タイプのデータ項目が基本。
  • TALLYINGのカウンター変数は、使う前のゼロ初期化が絶対!
  • オプションを使いこなせば、より細かい操作が可能になる。
  • 注意点を守れば、安全で効率的な文字列操作が実現できる。

最初は少しとっつきにくいかもしれませんが、一度使い方を覚えてしまえば、これほど頼りになる命令もそうそうありません。

特に、データチェックやフォーマット編集といった地味だけど手間のかかる作業を、劇的に楽にしてくれます。

この記事を読んで、「なるほど!」と思った方は、ぜひお手元の環境で、サンプルコードを動かしたり、自分なりに応用例を試したりしてみてください。実際に手を動かしてみるのが、マスターへの一番の近道です。

さあ、あなたもINSPECT文を使いこなして、COBOLでの文字列操作をスマートに、そして効率的に進めていきましょう! きっと、あなたのCOBOLライフが、より快適になるはずですよ!

【関連記事】

>> 今さら聞けない「COBOLとは?」

このブログを検索

  • ()

自己紹介

自分の写真
リモートワークでエンジニア兼Webディレクターとして活動しています。プログラミングやAIなど、日々の業務や学びの中で得た知識や気づきをわかりやすく発信し、これからITスキルを身につけたい人にも役立つ情報をお届けします。 note → https://note.com/yurufuri X → https://x.com/mnao111

QooQ