1. 導入:なぜ文字列結合で「トリミング」が必要なのか
COBOLのデータ項目(PIC Xなど)は固定長であるため、定義した桁数に満たないデータは、後ろにスペースが埋められます。これをそのまま連結すると、意図しない大きな空白が混入してしまいます。例えば「姓」と「名」を連結して名簿を作成する際、単純なMOVEや連結では不格好な出力になりがちです。本稿では、STRING文のDELIMITED BY句を活用し、スマートに文字列を結合する方法を解説します。
2. 基礎知識:STRING文とDELIMITED BYの役割
STRING文は、複数の文字列を一つのデータ項目に結合するための命令です。ここで重要なのが「DELIMITED BY」句です。
DELIMITED BY SPACEを指定すると、結合対象の項目から「最初のスペース」を見つけた時点で処理を打ち切り、それ以降の空白を無視して次の項目へ連結します。これにより、可変長データのような柔軟な文字列操作が可能になります。
3. 実装・解決策:スマートな結合の手順
文字列を結合する際は、以下の手順で実装するのが定石です。
1. 結合先のターゲット項目を、あらかじめSPACESで初期化する。
2. POINTER句を使用して、現在の書き込み位置を制御する。
3. DELIMITED BY SPACEを指定し、不要な空白を除去する。
この手順を踏むことで、データの重なりや予期せぬ空白混入を防ぐことができます。
4. サンプルプログラム
以下のコードは、苗字と名前を間にスペースを挟んで結合し、一つのフルネームを作る実用的な例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. STRING-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 LAST-NAME PIC X(10) VALUE ‘YAMADA ‘.
01 FIRST-NAME PIC X(10) VALUE ‘TARO ‘.
01 FULL-NAME PIC X(25) VALUE SPACES.
01 WORK-PTR PIC 9(02) VALUE 1.
PROCEDURE DIVISION.
> 1. 姓を結合(スペースまで)
STRING LAST-NAME DELIMITED BY SPACE
‘ ‘ DELIMITED BY SIZE
FIRST-NAME DELIMITED BY SPACE
INTO FULL-NAME
POINTER WORK-PTR
END-STRING.
> 結果を表示:山田 太郎 と出力される
DISPLAY ‘結合結果: [‘ FULL-NAME ‘]’.
STOP RUN.
5. 応用・注意点:現場でハマらないために
実務でこの機能を使う際、注意すべき点が二つあります。
一つ目は「結合後の桁数オーバー」です。STRING文はターゲットの桁数を超えると、それ以上の書き込みを停止します。必ず受取側の項目(FULL-NAME)は、結合後の最大長を十分に確保してください。
二つ目は「末尾のスペースを保持したい場合」です。もしデータ自体に意味のある空白が含まれている場合は、DELIMITED BY SIZEを使用してください。要件に応じてこれらを使い分けるのが、熟練COBOL技術者のデータ操作の作法です。

コメント