導入:なぜ今、STORED-CHAR-LENGTHが重要なのか
COBOL開発において、文字列の扱いは常に頭を悩ませるポイントです。特に、可変長のデータを取り扱う際、PICTURE句で定義された固定長(例えば PIC X(100))をそのまま扱うと、後ろに続く不要なスペースまで連結されてしまい、意図しないレイアウト崩れや無駄な処理が発生します。
これまで、多くの現場では「INSPECT文でスペースをカウントする」といった泥臭い処理で対処してきましたが、コードの可読性が落ちる上に、メンテナンス性も良くありません。今回解説する STORED-CHAR-LENGTH 関数を活用すれば、実質的な文字列長をスマートに取得でき、動的な連結処理やデータ出力の効率を劇的に向上させることが可能です。
基礎知識:PICTURE句の長さと「実データ長」の違い
COBOLの文字列データは、定義した時点でメモリ上のサイズが固定されます。例えば PIC X(20) VALUE ‘ABC’ と宣言した場合、メモリ上には ‘ABC’ の後に17個の空白(スペース)が詰まった状態で保持されます。
STORED-CHAR-LENGTH 関数は、この「PICTURE句で決まった長さ」ではなく、末尾の空白を除いた、実際に文字が格納されているバイト数を返してくれます。これにより、文字列の右端に何が書かれているかを意識することなく、後続の処理(文字列連結やサブストリングなど)を動的に制御できるようになります。
実装・解決策
基本構文は非常にシンプルで、COMPUTE文の中で呼び出すだけです。
COMPUTE WS-LEN = FUNCTION STORED-CHAR-LENGTH(WS-STR)
この関数の戻り値は整数として返されるため、そのまま添字として利用したり、ファイルへの書き込み時の文字数制限チェックに活用したりと、応用範囲は非常に広いです。
サンプルプログラム
以下に、文字列を動的に連結する際のサンプルコードを記述します。
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-LENGTH-FUNC.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STR-1 PIC X(20) VALUE “COBOL”.
01 WS-STR-2 PIC X(20) VALUE “DEVELOPER”.
01 WS-RESULT PIC X(40).
01 WS-LEN-1 PIC 9(02).
01 WS-LEN-2 PIC 9(02).
PROCEDURE DIVISION.
> 1. それぞれの文字列の実質的な長さを取得
COMPUTE WS-LEN-1 = FUNCTION STORED-CHAR-LENGTH(WS-STR-1)
COMPUTE WS-LEN-2 = FUNCTION STORED-CHAR-LENGTH(WS-STR-2)
> 2. 長さを元にして、スペースを含めずに連結する
> 最初の文字列をセットし、その長さの次から2番目の文字列をコピーする
MOVE WS-STR-1(1:WS-LEN-1) TO WS-RESULT(1:WS-LEN-1)
MOVE ” ” TO WS-RESULT(WS-LEN-1 + 1 : 1)
MOVE WS-STR-2(1:WS-LEN-2) TO WS-RESULT(WS-LEN-1 + 2 : WS-LEN-2)
DISPLAY “連結結果: [” WS-RESULT “]”
GOBACK.
応用・注意点:現場での活用と落とし穴
応用:動的なファイル出力
CSVファイルや固定長フォーマットの出力時、末尾のスペースをカットして送出する必要があるインターフェース開発などで、この関数は非常に強力です。特に、可変長項目を扱う際に、冗長なコードを削減できます。
注意点:全角文字の扱い
日本語(マルチバイト文字)を扱う場合、コンパイラの仕様やエンコーディング(Shift-JISやUTF-8など)によって、戻り値が「文字数」なのか「バイト数」なのかが異なる場合があります。現場の環境に合わせて、必ず事前に小さなテストプログラムを組み、期待する値が返るかを確認してください。また、末尾に意図的にスペースを残したいデータ(住所など)に対して使用すると、必要な空白まで削られてしまうため、「本当に末尾の空白を削除して良い項目か」を見極めることが、バグを未然に防ぐ鍵となります。

コメント