【COBOL学習|豆知識】COBOLの「UNSTRING … COUNT IN」で実現する柔軟なデータ解析術

導入: なぜ「COUNT IN」が重要なのか

COBOLの現場では、CSVファイルや固定長ではない外部システムからのデータを取り扱う場面が多々あります。単に文字列を分割するだけでなく、「実際に何文字取り出せたのか」を把握することは、バグを未然に防ぐ重要なテクニックです。特に、受け取ったデータの長さが仕様通りかを確認したり、次の処理でトリミング範囲を動的に制御したりする場合、「COUNT IN」句は非常に頼りになる武器となります。

基礎知識: UNSTRINGとCOUNT INの仕組み

UNSTRING文は、1つの文字列を特定の区切り文字(デリミタ)で見つけて、複数の受け取り先変数に分解する命令です。ここでCOUNT IN句を併用すると、分解された個々のデータが「実際に何文字分だったか」を、指定した数値項目に格納することができます。
注意点として、COUNT INで取得される数値には、受け取り先変数に定義された「空白(スペース)」は含まれません。あくまで「データ本体の文字数」がカウントされます。

実装/解決策: データの長さを取得してバリデーションを行う

単純に分割するだけでなく、取得した文字数をチェック変数に格納することで、最大長を超えていないかのチェックや、後続処理でのインデックス制御に活用します。これにより、データが欠損していたり、逆に長すぎたりする場合の異常検知が容易になります。

サンプルプログラム

以下のコードは、カンマ区切りの文字列からデータを抽出し、それぞれの文字数を動的に取得する例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. UNSTRING-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-INPUT-DATA PIC X(30) VALUE “COBOL,MAINFRAME,TEST”.
01 WS-ITEM-1 PIC X(10).
01 WS-ITEM-2 PIC X(10).
01 WS-ITEM-3 PIC X(10).

  • 各項目の文字数を保持するための数値項目

01 WS-LEN-1 PIC 9(02).
01 WS-LEN-2 PIC 9(02).
01 WS-LEN-3 PIC 9(02).

PROCEDURE DIVISION.
INITIALIZE WS-ITEM-1 WS-ITEM-2 WS-ITEM-3.

  • UNSTRINGを使用してカンマで分割し、同時に長さをカウントする

UNSTRING WS-INPUT-DATA DELIMITED BY “,”
INTO WS-ITEM-1 COUNT IN WS-LEN-1
WS-ITEM-2 COUNT IN WS-LEN-2
WS-ITEM-3 COUNT IN WS-LEN-3
END-UNSTRING.

  • 結果を表示(実務ではここで長さの妥当性チェックを行う)

DISPLAY “ITEM1: ” WS-ITEM-1 ” 長さ: ” WS-LEN-1.
DISPLAY “ITEM2: ” WS-ITEM-2 ” 長さ: ” WS-LEN-2.
DISPLAY “ITEM3: ” WS-ITEM-3 ” 長さ: ” WS-LEN-3.

GOBACK.

応用・注意点: 現場での落とし穴

1. 受取側の桁数に注意
COUNT INで取得されるのは「対象データの有効文字数」ですが、受け取り先の変数(PIC Xなど)が小さすぎると、データが切り捨てられてしまいます。UNSTRINGを行う前に、必ず受取側変数のサイズが十分であることを確認してください。

2. スペースの扱い
COUNT INは、文字列内の「後続スペース」を含めません。例えば「ABC 」というデータであれば、COUNT INの結果は「3」となります。もしスペースを含めた長さを知りたい場合は、DELIMITED BY SIZEを併用するか、別のアプローチが必要になります。

この機能を使いこなせば、文字列操作のロジックが格段にスマートになります。ぜひ次回のコーディングから取り入れてみてください。

コメント

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