COBOLの分割(UNSTRING文)について解説

分割について解説

今回はCOBOLの分割についてゆるっと解説します。
COBOLで分割する際にはUNSTRING文を使用することで、簡単に分割することができます。また、文字列だけでなく数値項目等も分割することができますので、この機会にぜひ覚えてください。

分割の基本的な方法

分割例1

基本的な分割方法は、UNSTRINGを使用します。
まず最初の例は分割対象の文字列「123*456」を「123」と「456」に分割したい場合です。文字列内にある「*」を区切り文字として分割する方法を解説します。

UNSTRING "123*456" DELIMITED BY "*"
INTO    receiver-id1 *> "123"
        receiver-id2 *> "456"
END-UNSTRING.

上記コード例の通り、UNSTRING文で囲み、分割したい文字列をUNSTRINGに続けます。その後区切り文字を「DELIMITED BY」の後に指定することで、指定する区切り文字で文字列を分割することができます。
また、分割した文字列はINTOに続けて指定した変数の中に格納されます。格納される順番は文字列左から順番に格納されます、今回の例では「receiver-id1」に「123」が格納され、「receiver-id2」に「456」が格納されます。

上記コード例では分割対象文字列と区切り文字を文字列で指定していますが、もちろん変数を指定することができます。今回は解説のしやすから、文字列を直接指定しています。

区切り文字の複数指定

区切り文字を二つ以上指定するには、「OR」を使用することで実現できます。
「OR」を区切り文字の後に使用することで続けて区切り文字を指定することができます。

UNSTRING "123*456?789" DELIMITED BY "*" OR "?"
INTO    receiver-id1 *> "123"
        receiver-id2 *> "456"
        receiver-id3 *> "789"
END-UNSTRING.

上記例は区切り文字を二つ「*」と「?」を指定しています。
区切り文字を複数指定した結果、文字列は3つに分割することができます。

連続して出現する区切り文字の対応方法

文字列を分割したい時、文字列の中に区切り文字が連続で出現することがある。
その場合には「ALL」を使用することで、連続する区切り文字を一つの区切り文字として分割することができる。

「ALL」指定をしない場合

UNSTRING "123**456*789" DELIMITED BY "*"
INTO    receiver-id1 *> "123"
        receiver-id2 *> ""
        receiver-id3 *> "456"
END-UNSTRING.

上記コード例では、区切り文字のアスタリスク「*」が連続で出現しています。その場合「ALL」指定をしないと、「receiver-id2」には何も文字列が入りません。

「ALL」を指定する場合

UNSTRING "123**456*789" DELIMITED BY ALL "*"
INTO    receiver-id1 *> "123"
        receiver-id2 *> "456"
        receiver-id3 *> "789"
END-UNSTRING.

「ALL」を指定することで、連続する区切り文字をその都度分割するのではなく、一つの区切り文字として分割することができます。

上記コード例では、「123**456」と123に続いて「*」が連続していますが、区切り文字を指定する際に「ALL “*”」と指定することで、連続する区切り文字があっても文字列を分割することができます。

複数文字の区切り文字

区切り文字には複数文字を指定することもできます。

先ほどの例ではアスタリスク「*」を指定していましたが、「*4」と複数文字の区切り文字を使用することもできます。

UNSTRING "123*456" DELIMITED BY "*4"
INTO    receiver-id1 *> "123"
        receiver-id2 *> "56"
END-UNSTRING.

分割時の区切り文字を変数に保存する – DELIMITER IN

区切り文字を一つ指定する場合は、どの区切り文字を使って文字列を分割したかを知る必要はありません。
しかし、複数の区切り文字を指定する場合は、どの区切り文字を使用して分割したかを知る必要があることがあると思います。

そこで使用するのが「DELIMITER IN」です。「DELIMITER IN」を使用することで、次に続く変数に区切り文字を格納することができます。(なお、DELIMITED BYで複数区切り文字を指定している必要がある)

UNSTRING "123*456?789" DELIMITED BY ALL "*" OR ALL "?"
INTO    receiver-id1 DELIMITER IN delim-1 *> "*"
        receiver-id2 DELIMITER IN delim-2 *> "?"
        receiver-id3 DELIMITER IN delim-3 *> ""
END-UNSTRING.

上記コードのように、「DELIMITER IN」で指定することで、変数「delim-1」にどの区切り文字を使用して文字列を区切ったのかが格納されます。
なお、最後の文字列「789」の後ろに区切り文字はないため、変数「delim-3」には何も格納されません。 

分割後の長さをカウントする方法 – COUNT IN

分割した文字列の長さをカウントするためには「COUNT IN」を使用します。「COUNT IN」の後に変数を指定することで、カウントした文字数を格納することができるます。

UNSTRING "123*456?789" DELIMITED BY ALL "*" OR ALL "?"
INTO    receiver-id1 COUNT IN cnt1 *> 3
        receiver-id2 COUNT IN cnt2 *> 5
        receiver-id3 COUNT IN cnt3 *> 3
END-UNSTRING.

上記のコード例では、まず文字列「123*456?789」を「*」で分割して、「receiver-id1」変数に「123」を格納しています。
その後、「COUNT IN」を使って、変数「receiver-id1」に格納された文字列の長さを数え、その結果を「cnt1」という変数に格納しています。長さは3文字なので「cnt1」には3が格納されます。
同様に、「receiver-id2」、「receiver-id3」についてもカウントを行っています。

分割した回数をカウントする方法 – TALLYING IN

事前に分割前の文字列の内容を知っていれば、分割した回数というのは数えれば分かりますが、分割前の文字列がわからない場合については、分割した回数を知ることができません。
そのため続いては、分割した回数をカウントする方法について解説します。

分割した回数をカウントするためには、「TALLYING IN」を使用します。「TALLYING IN」の後に続ける変数にカウントした回数を足していきます。そのため、この変数は初期値を「0」と設定することで、分割した回数を正確にカウントすることができます。

UNSTRING "123*456*789" DELIMITED BY "*"
INTO    receiver-id1
        receiver-id2
        receiver-id3
        receiver-id4
        TALLYING IN full-cnt *> 3
END-UNSTRING.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA