COBOLのUNSTRING文で文字列を分割する方法を徹底解説!初心者向け入門ガイド
生徒
「先生、COBOLで文字列をバラバラに分ける方法ってありますか?」
先生
「はい、COBOLではUNSTRING文を使って文字列を分割することができます。」
生徒
「UNSTRINGって何ですか?どうやって使うんですか?」
先生
「それでは、UNSTRING文の基本的な使い方から一緒に学んでいきましょう。」
1. UNSTRING文とは?
COBOLのUNSTRING文は、ひとつの長い文字列を指定した区切り文字で分割し、それぞれを別々の変数に格納するための命令です。
例えば、カンマ「,」で区切られた「田中,太郎,30」という文字列があった場合に、「田中」「太郎」「30」と3つの要素に分けることができます。
プログラムの世界では、このような処理を文字列分割やパースと呼びます。
この仕組みを使うことで、CSVファイルのようにカンマ区切りで保存されているデータを簡単に取り出すことができます。
また、氏名や住所などの情報を「名字」と「名前」に分けたり、「郵便番号」と「住所」に切り分けたりすることも可能です。
2. UNSTRING文の基本的な書き方
まずは基本的な構文を紹介します。
UNSTRING 元の文字列
DELIMITED BY 区切り文字
INTO 変数1 変数2 変数3 ...
END-UNSTRING
- 元の文字列:分割したい文字列を指定します。
- DELIMITED BY:どの文字で区切るかを指定します。例えばカンマ(,)やスペース(半角空白)などです。
- INTO:分割後に格納する変数を順番に並べて書きます。
3. 実際のサンプルコード
それでは実際にサンプルプログラムを見てみましょう。
IDENTIFICATION DIVISION.
PROGRAM-ID. UNSTRING-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 INPUT-DATA PIC X(20) VALUE "田中,太郎,30".
01 LAST-NAME PIC X(10).
01 FIRST-NAME PIC X(10).
01 AGE PIC X(3).
PROCEDURE DIVISION.
UNSTRING INPUT-DATA
DELIMITED BY ","
INTO LAST-NAME FIRST-NAME AGE
END-UNSTRING
DISPLAY "名字: " LAST-NAME
DISPLAY "名前: " FIRST-NAME
DISPLAY "年齢: " AGE
STOP RUN.
このプログラムを実行すると、次のような結果が得られます。
名字: 田中
名前: 太郎
年齢: 30
4. UNSTRING文の便利なオプション
UNSTRING文には、初心者が知っておくと便利なオプションがいくつかあります。ここでは代表的なものを紹介します。
① WITH POINTER
分割処理の途中で「文字列のどこまで処理したか」を記録することができます。
例えば「山田,花子,25,東京都」という長いデータを分割して、3つ目の項目まで処理したあと、次の項目から処理を続けたい場合に便利です。
01 POINTER-NUM PIC 9(3) VALUE 1.
UNSTRING INPUT-DATA
DELIMITED BY ","
INTO LAST-NAME FIRST-NAME AGE
WITH POINTER POINTER-NUM
END-UNSTRING
② TALLYING
分割して実際にいくつの項目を取り出せたかをカウントしてくれます。
データの中に空の項目がある場合や、分割した数を確認したいときに役立ちます。
01 COUNT-NUM PIC 9(3).
UNSTRING INPUT-DATA
DELIMITED BY ","
INTO LAST-NAME FIRST-NAME AGE
TALLYING COUNT-NUM
END-UNSTRING
5. 日常生活にたとえて理解しよう
文字列の分割は、実はとても身近な考え方です。
例えば、スーパーで「りんご・みかん・バナナ」と書かれた買い物メモを見たとします。
これをそのままでは「果物のリスト」としてしか使えませんが、「りんご」「みかん」「バナナ」と分けることで、個別にかごに入れることができます。
COBOLのUNSTRING文は、この「・」の部分を区切り文字と見なして、メモを自動で3つに分けてくれるイメージです。
6. よく使われる応用例
初心者が実際に使う場面をイメージしやすいように、よくある応用例を紹介します。
- 住所を「郵便番号」「都道府県」「市区町村」に分ける
- CSVデータを1行ずつ分解して項目ごとに処理する
- スペース区切りの入力を個別の単語に分ける
これらの処理は、すべてUNSTRING文を使って簡単に実現できます。
特に業務システムでは、社員名簿や商品リストなどを分割して利用することが多いため、UNSTRING文は必須のスキルと言えます。
まとめ
COBOLのUNSTRING文は、業務システムの中でも非常に使用頻度が高い文字列分割処理をシンプルに実現できる強力な機能です。今回の記事では、区切り文字を指定して文字列を複数の項目に分ける基本的な使い方から、WITH POINTER や TALLYING といった便利なオプションまで、初心者でも理解しやすいように段階を追って解説しました。UNSTRING文を活用することで、CSVの1行を項目ごとに分解したり、住所データを郵便番号や都道府県に切り分けたりと、多くの場面で効率の良いデータ操作が可能になります。 特に、COBOLのような業務系プログラムでは、文字列をどのように加工するかがプログラム全体の処理効率や保守性に大きく影響します。そのため、UNSTRING文を正しく理解し、TALLYING や WITH POINTER を上手に使いこなせるようになると、日常のデータ処理の幅が大きく広がります。そして、分割後の結果を別の処理やサブルーチンに渡したり、ファイルに出力したりと、他の機能と組み合わせることで、さらに柔軟なデータ操作ができるようになります。 以下に、記事の理解を深めるための総合的なサンプルコードを掲載します。分割処理とオプション使用がひとつにまとまった例として、復習の参考にしてください。
UNSTRING文の総合サンプルコード
IDENTIFICATION DIVISION.
PROGRAM-ID. UNSTRING-SUMMARY.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATA PIC X(40)
VALUE "山田,花子,28,東京都練馬区".
01 WS-LAST PIC X(10).
01 WS-FIRST PIC X(10).
01 WS-AGE PIC X(3).
01 WS-ADDR PIC X(20).
01 WS-POINTER PIC 9(3) VALUE 1.
01 WS-COUNT PIC 9(3).
PROCEDURE DIVISION.
UNSTRING WS-DATA
DELIMITED BY ","
INTO WS-LAST WS-FIRST WS-AGE WS-ADDR
WITH POINTER WS-POINTER
TALLYING WS-COUNT
END-UNSTRING
DISPLAY "名字:" WS-LAST
DISPLAY "名前:" WS-FIRST
DISPLAY "年齢:" WS-AGE
DISPLAY "住所:" WS-ADDR
DISPLAY "取り出した項目数:" WS-COUNT
STOP RUN.
このサンプルでは、区切り文字ごとに名前・年齢・住所を切り出し、WITH POINTER で「どこまで読み取ったか」を追跡しつつ、TALLYING で「いくつ取り出せたのか」をカウントしています。実務で必要になる情報がひとつの例にまとまっているため、応用への理解が進みやすくなっています。 また、UNSTRING は単に文字列をバラバラにするだけでなく、入力データの形式があらかじめ決まっている場合には特に強力な手段になります。CSV形式のファイルを読み込むバッチ処理や、オンライン入力の値を項目ごとに整理する画面処理など、あらゆる場面で活躍します。こうした処理を手作業で実装しようとすると複雑になりがちですが、UNSTRING文を使えば簡潔で読みやすいプログラムに仕上げることができます。 さらに、UNSTRINGは他のCOBOL命令とも相性が良く、STRING文と組み合わせて「分割したデータを整形して結合する」など、より高度な処理も可能です。初心者の段階ではまず基本構文とオプションの動きを理解し、日常的なデータ分割処理から実践していくと自然にスキルが身につきます。文字列操作の基礎をしっかり押さえておくことで、業務プログラムの作成や保守が格段に楽になるでしょう。
生徒
「UNSTRING文って、思っていたよりずっと便利なんですね!特に区切り文字でデータがきれいに取り出せるのが嬉しいです。」
先生
「そうなんです。CSVデータや名前の分割など、実務で使う場面がとても多いので習得すると一気に作業が楽になりますよ。」
生徒
「WITH POINTER と TALLYING の意味もやっと理解できました。どこまで読み取ったか管理できるのはありがたいですね。」
先生
「その通りです。長い文字列や複数行のデータを扱うときにとても役立つオプションですから、ぜひ積極的に使ってみてください。」
生徒
「これならCSV処理にも応用できそうです!次はSTRING文との組み合わせにも挑戦してみたいです。」
先生
「とても良い考えですね。文字列操作の幅が広がると、COBOLプログラムの表現力もぐっと高まりますよ。」