COBOLの文字列検索を完全ガイド!INSPECTとUNSTRINGの使い方を初心者向けに解説
生徒
「COBOLで文字の中から特定の言葉を探したり、文字列を区切って取り出したりできますか?」
先生
「COBOLでは、INSPECTやUNSTRINGを使うと、文字列検索や文字列分割を行うことができます。」
生徒
「文字列検索と文字列分割は、どんな場面で使うんですか?」
先生
「氏名、住所、商品コード、伝票番号、CSV形式のデータなどを処理するときによく使います。基本から順番に見ていきましょう。」
1. COBOLの文字列検索とは?
COBOLの文字列検索とは、文字の集まりである文字列の中から、指定した文字や言葉を探す処理のことです。たとえば、商品コードの中に特定の記号が含まれているか、氏名の中に空白があるか、住所の中に都道府県名が含まれているかを確認したい場面があります。プログラミング未経験の方にわかりやすく言うと、長い文章の中から目的の言葉を目で探す作業を、COBOLの命令で自動化するイメージです。
COBOLは事務処理や基幹システムで長く使われてきた言語です。そのため、伝票データ、顧客データ、売上データ、固定長ファイル、CSVデータのように、文字列を扱う処理が多く登場します。文字列操作を理解すると、入力されたデータの確認、項目の切り出し、文字数の確認、区切り文字による分割などができるようになります。
COBOLで文字列検索を行うときによく使われる命令がINSPECTです。INSPECTは、文字列の中に指定した文字が何回出てくるかを数えたり、文字を別の文字に置き換えたりできます。また、文字列を区切って複数の項目に分けたい場合はUNSTRINGを使います。この記事では、COBOL初心者がつまずきやすいINSPECTとUNSTRINGの基本を、検索パターンとして整理しながら解説します。
2. INSPECTで文字を数える基本パターン
INSPECTは、COBOLの文字列操作でよく使われる命令です。基本的な使い方のひとつが、特定の文字が文字列の中に何回出てくるかを数える処理です。この処理は、TALLYINGという指定と一緒に使います。TALLYINGは、数を数えるための指定だと考えるとわかりやすいです。
たとえば、商品コードや会員番号の中にハイフンが含まれているかを確認したい場合があります。ハイフンの数を数えることで、入力された形式が正しいかどうかを判断する材料になります。初心者の方は、まず文字列を箱、探したい文字を目印として考えると理解しやすくなります。箱の中に目印がいくつあるかを数えるのがINSPECT TALLYINGの基本です。
IDENTIFICATION DIVISION.
PROGRAM-ID. INSPECT-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CODE PIC X(20) VALUE "A-100-B-200".
01 WS-COUNT PIC 9(02) VALUE 0.
PROCEDURE DIVISION.
INSPECT WS-CODE TALLYING WS-COUNT FOR ALL "-".
DISPLAY "ハイフンの数:" WS-COUNT.
STOP RUN.
ハイフンの数:03
この例では、WS-CODEの中にあるハイフンを数えています。FOR ALLは、指定した文字をすべて対象にするという意味です。結果はWS-COUNTに入ります。実務では、電話番号、郵便番号、商品番号、伝票番号などの形式チェックにも応用できます。
3. INSPECTで特定の文字を置き換えるパターン
INSPECTは文字を数えるだけでなく、文字を置き換えることもできます。文字を置き換える処理ではREPLACINGを使います。たとえば、入力された商品コードの中に空白が入っている場合、その空白をゼロに変える、または見やすい記号に変えるような処理ができます。
置き換えは、検索した文字を別の文字へ変換する処理です。日常の作業で言えば、文章作成ソフトの置換機能に近い考え方です。文字列の中にある古い文字を探して、新しい文字に差し替えるという流れです。COBOLでは固定長の文字列を扱うことが多いため、空白や記号の扱いを理解しておくと、データ整形の処理が書きやすくなります。
IDENTIFICATION DIVISION.
PROGRAM-ID. REPLACE-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME PIC X(20) VALUE "YAMADA TARO".
PROCEDURE DIVISION.
INSPECT WS-NAME REPLACING ALL " " BY "-".
DISPLAY WS-NAME.
STOP RUN.
YAMADA-TARO
この例では、WS-NAMEに入っている空白をハイフンに置き換えています。COBOLでは空白も文字として扱われます。そのため、空白を検索対象にすれば、名前やコードの中にある不要な空白を処理できます。データを画面に表示する前や、ファイルへ出力する前に形を整える場合にも便利です。
4. INSPECTで文字列の一部だけを調べる考え方
COBOLの文字列検索では、文字列全体を調べるだけでなく、考え方として一部だけを対象にすることも大切です。たとえば、商品コードの先頭だけを見て分類したい場合や、会員番号の後半だけを確認したい場合があります。COBOLでは参照修飾という書き方を使うと、文字列の指定した位置から指定した長さだけを取り出して扱えます。
参照修飾は、文字列を切り取るための書き方です。たとえば、WS-CODE(1:3)と書くと、WS-CODEの1文字目から3文字分を対象にします。初心者の方は、文字列を横に並んだ箱として考えてください。左から何番目の箱から、何個分を見るかを指定するのが参照修飾です。
IDENTIFICATION DIVISION.
PROGRAM-ID. PART-CHECK.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CODE PIC X(10) VALUE "ABC-001".
01 WS-COUNT PIC 9(02) VALUE 0.
PROCEDURE DIVISION.
INSPECT WS-CODE(1:3) TALLYING WS-COUNT FOR ALL "A".
DISPLAY "先頭三文字のAの数:" WS-COUNT.
STOP RUN.
先頭三文字のAの数:01
このように参照修飾を組み合わせると、文字列検索の対象を絞ることができます。業務システムでは、コードの先頭数文字に意味を持たせることがあります。たとえば、先頭が商品種別、中央が地域番号、最後が連番というような形式です。必要な部分だけを調べることで、読みやすく無駄の少ないCOBOLプログラムになります。
5. UNSTRINGで文字列を区切って取り出す基本パターン
UNSTRINGは、文字列を区切り文字で分割して、複数の項目へ取り出す命令です。区切り文字とは、文字列を分ける目印になる文字のことです。たとえば、CSV形式ではカンマが区切り文字として使われます。氏名を姓と名に分けたい場合は空白を区切り文字にすることもあります。
プログラミング未経験の方には、一本につながったデータを、はさみで切って別々の箱へ入れる作業と考えるとわかりやすいです。UNSTRINGを使うと、ひとつの文字列から名前、年齢、住所、商品名などを取り出せます。COBOLのファイル処理や帳票処理では、外部から受け取った文字列を項目ごとに分ける場面が多いため、UNSTRINGはとても重要です。
IDENTIFICATION DIVISION.
PROGRAM-ID. UNSTRING-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATA PIC X(50) VALUE "YAMADA,TARO,TOKYO".
01 WS-LAST-NAME PIC X(20).
01 WS-FIRST-NAME PIC X(20).
01 WS-AREA PIC X(20).
PROCEDURE DIVISION.
UNSTRING WS-DATA
DELIMITED BY ","
INTO WS-LAST-NAME
WS-FIRST-NAME
WS-AREA.
DISPLAY "姓:" WS-LAST-NAME.
DISPLAY "名:" WS-FIRST-NAME.
DISPLAY "地域:" WS-AREA.
STOP RUN.
姓:YAMADA
名:TARO
地域:TOKYO
この例では、カンマで区切られた文字列を3つの項目に分けています。DELIMITED BYは、どの文字を区切りとして使うかを指定する部分です。INTOの後ろには、取り出した値を入れる項目を順番に書きます。CSVデータの読み込みや、外部システムから受け取った文字列の加工でよく使われる基本パターンです。
6. UNSTRINGで空白区切りの文字列を分けるパターン
UNSTRINGはカンマだけでなく、空白を区切り文字にすることもできます。たとえば、氏名が半角空白で区切られている場合、姓と名を別々の項目に分けることができます。入力画面やファイルから受け取った名前を、あとで検索しやすい形にする場合に便利です。
空白区切りを扱うときは、データの中に余分な空白が含まれていないかにも注意します。COBOLでは固定長の項目が多いため、見た目では同じように見えても、後ろに空白が入っていることがあります。文字列操作では、この空白の扱いが結果に影響することがあります。初心者の段階では、まず空白もひとつの文字であると覚えておくと理解しやすくなります。
IDENTIFICATION DIVISION.
PROGRAM-ID. UNSTRING-SPACE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-FULL-NAME PIC X(30) VALUE "SUZUKI HANAKO".
01 WS-SEI PIC X(15).
01 WS-MEI PIC X(15).
PROCEDURE DIVISION.
UNSTRING WS-FULL-NAME
DELIMITED BY SPACE
INTO WS-SEI
WS-MEI.
DISPLAY "姓:" WS-SEI.
DISPLAY "名:" WS-MEI.
STOP RUN.
姓:SUZUKI
名:HANAKO
DELIMITED BY SPACEと書くことで、空白を区切り文字として指定できます。名前の分割、住所の一部切り出し、キーワードの分割などに利用できます。ただし、日本語の氏名では空白が入らない場合や、全角空白が使われる場合もあります。実際の業務では、どのような形式で入力されるかを確認してから処理を作ることが大切です。
7. INSPECTとUNSTRINGの使い分け
INSPECTとUNSTRINGはどちらもCOBOLの文字列操作で使いますが、目的が異なります。INSPECTは、文字列の中を調べて数える、または置き換えるときに使います。一方、UNSTRINGは、ひとつの文字列を区切り文字で分けて、複数の項目に取り出すときに使います。
たとえば、商品コードの中にハイフンが何個あるかを確認したいならINSPECTが向いています。カンマで区切られたデータから商品名、価格、数量を取り出したいならUNSTRINGが向いています。つまり、探して数えるならINSPECT、分けて取り出すならUNSTRINGと考えると整理しやすいです。
| 命令 | 主な目的 | よく使う場面 |
|---|---|---|
INSPECT |
文字を数える、文字を置き換える | コードの形式確認、空白の置換、記号の数の確認 |
UNSTRING |
文字列を区切って項目に分ける | CSVデータの分割、氏名の分割、入力値の分解 |
初心者の方は、最初から複雑な文字列処理を作ろうとせず、まずは短い文字列で動きを確認することが大切です。文字列検索の結果が思った通りにならない場合は、対象の文字列、区切り文字、空白の有無、項目の長さを順番に確認しましょう。
8. 文字列検索で初心者が注意したいポイント
COBOLの文字列検索では、空白、文字数、データ項目の長さに注意が必要です。COBOLではPIC X(20)のように文字数を決めて項目を定義します。実際の値が短い場合、残りの部分には空白が入ります。そのため、画面に表示したときには見えなくても、内部的には空白が含まれていることがあります。
また、UNSTRINGで分割した値を入れる項目が短すぎると、文字が入りきらないことがあります。反対に、項目が長い場合は後ろに空白が残ります。検索や比較を行う前に、どの項目に何文字入るのかを確認しておくと、エラーや想定外の結果を減らせます。
もうひとつ大切なのは、区切り文字が本当にデータの中に存在するかを確認することです。カンマで分けるつもりでも、データが空白区切りになっていれば、正しく分割できません。ハイフンを数えるつもりでも、全角の記号が使われていれば一致しないことがあります。文字列検索では、見た目が似ている文字でも別の文字として扱われる場合があるため、入力データの形式をそろえることが重要です。
COBOLのINSPECTとUNSTRINGを覚えると、文字列の確認、検索、置換、分割という基本的な処理ができるようになります。基幹システムや事務処理では、商品データ、顧客データ、注文データ、売上データなど、文字列を正しく扱う力がとても重要です。まずは短いサンプルで動きを確認し、少しずつ実務で使う形式に近づけて練習していくと、COBOLの文字列操作が理解しやすくなります。
まとめ
COBOLの文字列検索と文字列操作では、INSPECTとUNSTRINGの役割を分けて理解することが大切です。INSPECTは、文字列の中にある特定の文字を数えたり、指定した文字を別の文字へ置き換えたりするときに使います。一方で、UNSTRINGは、カンマや空白などの区切り文字を目印にして、ひとつの文字列を複数の項目へ分けるときに使います。どちらもCOBOLの文字列処理では基本になる命令であり、商品コード、顧客名、住所、電話番号、伝票番号、CSVデータ、固定長データなどを扱う場面でよく登場します。
プログラミング初心者の方は、文字列という言葉だけで難しく感じるかもしれません。しかし、文字列は文字が横に並んだものです。たとえば、名前、住所、商品番号、注文番号、メールアドレスのようなデータは、すべて文字列として考えることができます。その中からハイフンを探す、空白を探す、カンマで分ける、先頭の文字を確認するという処理が、COBOLの文字列検索です。人が目で確認している作業を、プログラムに任せるための書き方だと考えると理解しやすくなります。
INSPECT TALLYINGは、指定した文字が何回出てくるかを数えるときに便利です。たとえば、商品コードにハイフンが含まれているか、電話番号の区切りが正しいか、CSVデータの中にカンマがいくつあるかを確認できます。入力チェックやデータ確認では、文字の数を数えるだけでも多くの判断ができます。特に業務システムでは、形式が決まっているデータを扱うことが多いため、文字列の中身を確認する処理はとても重要です。
IDENTIFICATION DIVISION.
PROGRAM-ID. SUMMARY-INSPECT.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TEL PIC X(20) VALUE "090-1234-5678".
01 WS-COUNT PIC 9(02) VALUE 0.
PROCEDURE DIVISION.
INSPECT WS-TEL TALLYING WS-COUNT FOR ALL "-".
DISPLAY "ハイフンの数:" WS-COUNT.
STOP RUN.
ハイフンの数:02
このように、INSPECTを使うと、電話番号や商品コードの中にある記号の数を簡単に確認できます。もしハイフンの数が想定と違う場合は、入力形式が間違っている可能性があります。COBOLの文字列検索は、単に文字を探すだけでなく、データが正しい形になっているかを確認するためにも使われます。
INSPECT REPLACINGは、文字を置き換えるときに使います。たとえば、氏名の空白をハイフンに変える、商品コードの空白をゼロに変える、不要な記号を別の文字に変えるといった処理ができます。データを画面に表示する前や、ファイルへ出力する前に、見やすい形へ整える場面で役立ちます。COBOLでは固定長の項目を扱うことが多く、値の後ろに空白が残ることもあります。そのため、空白をどう扱うかを意識することが大切です。
IDENTIFICATION DIVISION.
PROGRAM-ID. SUMMARY-REPLACE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CODE PIC X(20) VALUE "A 100 B 200".
PROCEDURE DIVISION.
INSPECT WS-CODE REPLACING ALL " " BY "-".
DISPLAY WS-CODE.
STOP RUN.
A-100-B-200
UNSTRINGは、文字列を分けて取り出すときに使います。たとえば、YAMADA,TARO,TOKYOのようにカンマで区切られた文字列がある場合、姓、名、地域を別々の項目へ分けることができます。CSV形式のデータ、外部システムから受け取ったデータ、入力欄にまとめて入ったデータを処理するときに便利です。DELIMITED BYで区切り文字を指定し、INTOで取り出した値を入れる項目を指定します。
IDENTIFICATION DIVISION.
PROGRAM-ID. SUMMARY-UNSTRING.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATA PIC X(50) VALUE "BOOK,2500,3".
01 WS-NAME PIC X(20).
01 WS-PRICE PIC X(10).
01 WS-COUNT PIC X(10).
PROCEDURE DIVISION.
UNSTRING WS-DATA
DELIMITED BY ","
INTO WS-NAME
WS-PRICE
WS-COUNT.
DISPLAY "商品名:" WS-NAME.
DISPLAY "価格:" WS-PRICE.
DISPLAY "数量:" WS-COUNT.
STOP RUN.
商品名:BOOK
価格:2500
数量:3
文字列検索や文字列分割で初心者が特に注意したいのは、空白と項目の長さです。COBOLではPIC X(20)のように文字数を決めてデータ項目を作ります。実際に入っている文字が短い場合でも、残りの部分には空白が入ります。画面では見えにくい空白も、プログラムの中では文字として扱われます。そのため、検索結果や分割結果が思った通りにならないときは、データの中に空白が入っていないか、区切り文字が本当に存在しているか、取り出し先の項目の長さが十分かを確認しましょう。
INSPECTとUNSTRINGを使い分けるときは、目的を先に考えると整理しやすくなります。文字を数えたい、文字を置き換えたい場合はINSPECTです。文字列をカンマや空白で分けて、それぞれ別の項目として使いたい場合はUNSTRINGです。どちらも似たような文字列操作に見えますが、役割は違います。探す、数える、置き換える、分けるという言葉で考えると、どの命令を使えばよいか判断しやすくなります。
COBOLの文字列操作は、古いシステムだけで使われるものではなく、現在も金融、保険、物流、販売管理、人事給与、請求処理などの基幹システムで重要な役割を持っています。大量のデータを正確に処理するためには、文字列の中身を確認し、必要な部分を取り出し、正しい形式へ整える力が必要です。最初は短いサンプルで、ハイフンを数える、空白を置き換える、カンマで分けるという基本から練習すると、COBOLの文字列検索が少しずつ理解できるようになります。
生徒
「COBOLの文字列検索は、文字を探すだけではなく、データの形式を確認するためにも使えるんですね。」
先生
「その通りです。INSPECTを使えば、ハイフンやカンマなどの文字が何回出てくるかを数えられるので、電話番号や商品コードの確認にも役立ちます。」
生徒
「文字を置き換えるときもINSPECTを使うんですね。空白をハイフンに変える例は、見た目にも分かりやすかったです。」
先生
「COBOLでは空白も大切な文字です。固定長の項目では後ろに空白が残ることもあるため、空白を意識して処理を書くことが大切です。」
生徒
「UNSTRINGは、カンマ区切りのデータを分けるときに使うと覚えればよさそうですね。」
先生
「はい。CSVデータのように、ひとつの文字列に複数の情報が入っている場合はUNSTRINGが便利です。区切り文字を指定して、必要な項目へ順番に取り出せます。」
生徒
「つまり、文字を数えるならINSPECT、文字列を分けるならUNSTRINGという考え方ですね。」
先生
「その理解で大丈夫です。COBOLの文字列操作では、まず何をしたいのかを決めることが大切です。検索したいのか、置き換えたいのか、分割したいのかを考えると、使う命令を選びやすくなります。」