【COBOL学習|初心者向け】COBOLのUNSTRING命令:デリミタ保存で複雑なデータ解析をスマートにこなそう

1. 導入:なぜデリミタ保存が重要なのか

COBOLで文字列を分解する際、よく使われるのがUNSTRING命令です。しかし、ただ分割するだけでは「どの区切り文字で分割されたか」という情報が捨てられてしまいます。例えば、「カンマ区切り」なのか「セミコロン区切り」なのかを区別する必要があるデータを取り扱う際、この情報を保持できるか否かでプログラムの複雑さが劇的に変わります。今回は、UNSTRINGの「DELIMITER IN」句を使って、スマートにデータを解析する技術を解説します。

2. 基礎知識:UNSTRINGとデリミタとは?

UNSTRING命令は、一つの大きな文字列を、指定した区切り文字(デリミタ)で見つけて、複数の項目に切り分ける命令です。
通常は「DELIMITED BY」で区切り文字を指定しますが、ここに「DELIMITER IN」句を追加することで、実際に分割に使われた区切り文字を別の変数に保存することができます。これにより、データの構造が混在していても、後続の処理で柔軟な分岐が可能になります。

3. 実装・解決策:DELIMITER INの活用法

実装は非常にシンプルです。分割先の項目を指定した後に「DELIMITER IN 項目名」を記述するだけです。注意点として、保存先の項目は、区切り文字を格納できるだけの長さ(通常は1バイト)を確保しておく必要があります。複数の区切り文字を候補に挙げている場合、そのうちどれが使われたかを特定できるため、データ形式のバリデーションにも応用可能です。

4. サンプルプログラム

以下のコードは、カンマまたはセミコロンで区切られたデータを解析し、どの文字で区切られたかを判定する例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. UNSTRING-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-INPUT-DATA PIC X(20) VALUE “APPLE,ORANGE;GRAPE”.
01 WS-ITEM-1 PIC X(10).
01 WS-ITEM-2 PIC X(10).
01 WS-DELIM PIC X(01).

PROCEDURE DIVISION.
> カンマまたはセミコロンで分解し、使われた区切り文字をWS-DELIMに格納
UNSTRING WS-INPUT-DATA
DELIMITED BY “,” OR “;”
INTO WS-ITEM-1
DELIMITER IN WS-DELIM
WS-ITEM-2
END-UNSTRING.

> 結果の表示
DISPLAY “項目1: ” WS-ITEM-1.
DISPLAY “区切り文字: ” WS-DELIM.
DISPLAY “項目2: ” WS-ITEM-2.

STOP RUN.

5. 応用・注意点:現場で陥りやすい罠

現場で活用する際の注意点は、「区切り文字が複数文字の場合」です。DELIMITER INで受け取る変数のサイズが不足していると、データが切り捨てられてしまいます。必ず「どの区切り文字が来てもすべて収まるサイズ」に定義してください。
また、複数の区切り文字を並べる場合、「DELIMITED BY ALL “,”」のようにALLを指定すると、連続するカンマを一つの区切りとして扱えますが、DELIMITER INにはそのうちの代表的な一つが格納されます。仕様に合わせて使い分けるのが、ベテランの作法です。データ解析の効率化に、ぜひ役立ててください。

コメント

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