導入
現場で避けて通れない処理の一つに「外部インターフェースの解析」があります。特にCSV形式のデータや、可変長の文字列を扱う際、昔ながらの「SEARCH文で区切り文字を検索し、MOVEで切り出す」といった手法は、冗長で保守性が低いコードになりがちです。
COBOLのUNSTRING文をマスターすれば、こうした文字列分解処理を数行で記述でき、可読性とメンテナンス性を飛躍的に向上させることができます。今回は、実務で安全に使うためのポイントを解説します。
基礎知識
UNSTRING文は、一つの文字列データ(送信側)を、指定した区切り文字(DELIMITED BY)で分割し、複数のターゲット項目(受取側)に順次格納する命令です。
特に重要なのは、単に分解するだけでなく「区切り文字が何個目にあるか(COUNT)」や「どこまで処理したか(POINTER)」を制御できる点です。これにより、複雑なデータ構造のパースも効率的に行えます。
実装/解決策
実務で最も注意すべきは「ターゲット項目のサイズ」と「区切り文字の欠落」です。
1. ターゲットのサイズ不足: 送信側の分割データが受取側のサイズを超えると、データが切り捨てられます。必要に応じて受信側を大きめに取るか、エラー処理を組み込む必要があります。
2. 空項目の扱い: CSVで「A,,C」のように空の項目がある場合、単なる分割ではズレが生じます。これに対処するために、DELIMITED BYの指定と、分割後の状態確認を組み合わせるのが定石です。
サンプルプログラム
以下のコードは、カンマ区切りの文字列を分解し、それぞれの項目に格納する基本的な実装例です。
[プログラム例]
IDENTIFICATION DIVISION.
PROGRAM-ID. UNSTRING-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CSV-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-COUNT PIC 9(02).
PROCEDURE DIVISION.
- UNSTRING文による分解処理
- DELIMITED BY “,” でカンマを区切り文字として指定
- COUNT IN WS-COUNT で、それぞれの項目に何文字格納されたかを取得可能
UNSTRING WS-CSV-DATA DELIMITED BY “,”
INTO WS-ITEM-1 COUNT IN WS-COUNT
WS-ITEM-2 COUNT IN WS-COUNT
WS-ITEM-3 COUNT IN WS-COUNT
END-UNSTRING.
- 結果の確認(本来はデバッグやログ出力にて確認)
DISPLAY “ITEM1: ” WS-ITEM-1
DISPLAY “ITEM2: ” WS-ITEM-2
DISPLAY “ITEM3: ” WS-ITEM-3.
GOBACK.
応用・注意点
現場でのトラブルを防ぐための注意点を二つ挙げます。
一つ目はPOINTER句の利用です。大きな文字列を一度に処理せず、読み込み位置を管理しながらループで少しずつ分解したい場合には、POINTER句でポインタ項目を指定してください。これにより、複雑な可変長レコードの解析もループ処理で柔軟に制御できます。
二つ目はDELIMITED ALLの活用です。もしデータ中に「,,」のように区切り文字が連続して含まれる場合、単なるDELIMITED BYでは空項目が正しく認識されないことがあります。DELIMITED BY ALL “,” と指定することで、連続する区切り文字を1つの区切りとして扱うことができ、パースの安定性が増します。
これらを意識するだけで、バグの混入を防ぎ、誰が読んでも理解できる美しいコードが書けるようになります。ぜひ次回の開発から取り入れてみてください。

コメント