【COBOL学習|初心者向け】COBOLのデータ結合術:STRING命令で「DELIMITED BY SIZE」を使いこなそう

1. 導入:なぜこの指定が必要なのか?

COBOLで文字列を結合する際、最もよく使われるのがSTRING命令です。通常、STRING命令は「スペース(空白)」を区切り文字として認識し、そこまでを転送しようとします。しかし、現場では「空白も含めて、とにかく全部くっつけたい」というケースが多々あります。そんな時に役立つのが「DELIMITED BY SIZE」です。この指定を知っているだけで、意図しないデータの切り捨てを防ぎ、確実なデータ加工が可能になります。

2. 基礎知識:DELIMITED BYとは何か

COBOLのSTRING命令において、DELIMITED BYは「どこまでを文字列として扱うか」を指示する重要なオプションです。
DELIMITED BY SIZEと書くと、「対象の項目の『サイズ(長さ)』そのものを境界とする」という意味になります。つまり、項目の中身にスペースが含まれていても、それら全てを無視して、定義された長さ分をそのまま連結するのです。

3. 実装・解決策:固定長データの連結

もしDELIMITED BY SIZEを指定しない場合、データ途中のスペースで転送が止まってしまい、期待した結果が得られないことがあります。固定長データや、途中にスペースが含まれることがわかっている項目を結合する場合は、必ずこの指定を用いるのが「ベテランの作法」です。

4. サンプルプログラム

以下のコードは、スペースを含む項目を、欠損なく連結する例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. STRING-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 ITEM-A PIC X(05) VALUE “A B”. > 途中にスペースがある
01 ITEM-B PIC X(03) VALUE “XYZ”.
01 RESULT-AREA PIC X(08) VALUE SPACES.
01 POINTER-VAL PIC 9(02) VALUE 1.

PROCEDURE DIVISION.
> DELIMITED BY SIZEを指定することで、ITEM-Aの全5桁をそのまま結合する
STRING ITEM-A DELIMITED BY SIZE
ITEM-B DELIMITED BY SIZE
INTO RESULT-AREA
POINTER POINTER-VAL.

DISPLAY “結合結果: ” RESULT-AREA.
STOP RUN.

5. 応用・注意点:現場での活用とバグ回避

現場でよくある失敗は、DELIMITED BY SIZEを書き忘れて、転送先のデータが途中で切れてしまうことです。特に、名簿データや住所データなど「スペースもデータの一部」として扱う場合は、この指定が必須となります。

また、INTO句で指定した受け取り側の領域(RESULT-AREA)が、連結後の合計長よりも短い場合、データは途中で切り捨てられます。あらかじめ受け取り側の長さを十分に確保しておくか、ON OVERFLOW句を併用してエラー処理を組み込むのが、堅牢なプログラムを書くための鉄則です。ぜひ活用してください。

コメント

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