「このデータの中にある特定の文字、いくつあるか数えたいな…」
「この部分の文字を、別の文字に全部変えたいんだけど、どうやるのがスマートかな?」
そんな時に頼りになるのが、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を何度も行うような場合、処理に時間がかかる可能性もゼロではありません。細かい文法ミス
ピリオドの位置を間違えたり、`TALLYING` や `REPLACING` などの予約語のスペルを間違えたり、といった基本的なミスも、慣れないうちは起こりがちです。これらの点を意識しておけば、INSPECT文をより安全かつ効果的に使いこなせるようになりますよ!
「INSPECT文」の便利な使い方(応用例)
基本的な使い方と注意点がわかったところで、INSPECT文のちょっと便利な応用例をいくつか紹介しましょう。「へぇ、こんなことにも使えるんだ!」と思ってもらえたら嬉しいです。
入力データの簡易チェック
ユーザーが入力したデータや、外部ファイルから読み込んだデータに、使ってはいけない文字(例えば、半角カナとか特定の記号とか)が含まれていないかチェックしたい時。日付やコードのフォーマット変換
例えば、'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ライフが、より快適になるはずですよ!
【関連記事】
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。