【COBOL学習|実務向け】COBOL実務で差がつく!UNSTRING … TALLYING IN による動的データ解析術

導入:なぜTALLYING INが重要なのか

COBOLの現場では、カンマ区切りのCSVデータや、固定長ではない可変長文字列を扱う機会が多々あります。単にUNSTRINGで分解するだけでは、「実際にいくつの項目が取り出せたのか」が分かりません。ここで「TALLYING IN」句を活用することで、分割された項目の数を正確に把握できます。これにより、ループ処理の制御や、データ形式の妥当性チェックが格段にスマートかつ安全に行えるようになります。

基礎知識:TALLYING INの仕組み

UNSTRING命令は、指定した区切り文字(DELIMITED BY)を基準に、対象文字列を分解して各受け取り項目(INTO …)に格納します。通常、受け取り側が多すぎれば余った項目は空になり、少なすぎればエラーフラグが立つことがありますが、TALLYING INを使用すると、実際に値が格納された(または処理された)項目の個数を数値項目に自動的にセットしてくれます。これは、後続の動的処理を行うための「制御変数」として非常に強力です。

実装・解決策:手順と論理

1. カウント用の数値項目(PIC 9(02)等)を定義する。
2. UNSTRING命令の末尾に「TALLYING IN 項目名」を追加する。
3. UNSTRING実行後、そのカウント値を利用して、取り出されたデータの数に応じた後続処理(ループやバリデーション)を分岐させる。

サンプルプログラム

以下のコードは、可変個のCSVデータから個数を判定し、動的に処理を行う例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. UNSTRING-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATA PIC X(50) VALUE “APPLE,ORANGE,BANANA”.
01 WS-ITEM-1 PIC X(10).
01 WS-ITEM-2 PIC X(10).
01 WS-ITEM-3 PIC X(10).
01 WS-ITEM-4 PIC X(10).

  • カウント格納用項目

01 WS-COUNT PIC 9(02).
01 I PIC 9(02).

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

  • カンマで区切り、取り出された個数をWS-COUNTに格納する

UNSTRING WS-DATA DELIMITED BY “,”
INTO WS-ITEM-1, WS-ITEM-2, WS-ITEM-3, WS-ITEM-4
TALLYING IN WS-COUNT.

DISPLAY “取り出された項目数: ” WS-COUNT.

  • カウント値に基づいた動的なループ処理例

PERFORM VARYING I FROM 1 BY 1 UNTIL I > WS-COUNT
DISPLAY “項目” I “番目: ”
EVALUATE I
WHEN 1 DISPLAY WS-ITEM-1
WHEN 2 DISPLAY WS-ITEM-2
WHEN 3 DISPLAY WS-ITEM-3
WHEN 4 DISPLAY WS-ITEM-4
END-EVALUATE
END-PERFORM.

STOP RUN.

応用・注意点:現場でのバグ回避

注意点1:受け取り項目の数
UNSTRINGで指定した受け取り項目(INTOの先)が、実際のデータ数より少ない場合、TALLYING INでカウントされる数値は「指定した受け取り項目の数」で打ち止めになるか、処理が中断される可能性があります。入力データの最大要素数を考慮して、受け取り項目を十分に確保しておくのが鉄則です。

注意点2:初期化の徹底
TALLYING INに使う数値項目は、UNSTRINGを実行するたびに必ず初期化(または直近の値をクリア)してください。初期化を忘れると、前回の処理結果が加算されるなどの予期せぬバグを引き起こします。

実務のコツ:
単なるデータ分割だけでなく、「項目数が規定数と一致しているか」をチェックするバリデーション関数として活用すると、保守性の高い堅牢なプログラムになります。ぜひ日々のコーディングに取り入れてみてください。

コメント

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