導入
これまでは1つの文字列を丸ごと扱う MOVE を見てきましたが、実務では「複数の文字列をつなげる」「区切り文字で分割する」「特定の文字を数える・置き換える」といった操作もよく必要になります。COBOLにはそれぞれ専用の命令が用意されています。
説明
STRING文(連結) … 複数の文字列を1つにつなげます。
01 WS-FIRST PIC X(10) VALUE "TANAKA".
01 WS-LAST PIC X(10) VALUE "TARO".
01 WS-FULL-NAME PIC X(21).
PROCEDURE DIVISION.
STRING WS-FIRST DELIMITED BY SPACE
" " DELIMITED BY SIZE
WS-LAST DELIMITED BY SPACE
INTO WS-FULL-NAME.
DISPLAY WS-FULL-NAME.
*> 結果: "TANAKA TARO"
DELIMITED BY SPACE… 「空白が出てきたところまで」を連結対象にする(右側の余分な空白を無視する)。DELIMITED BY SIZE… 宣言された桁数ぶん全部を連結対象にする。INTO WS-FULL-NAME… 連結結果の格納先。
UNSTRING文(分割) … 区切り文字で文字列を分割します。
01 WS-CSV-LINE PIC X(20) VALUE "Yamada,Hanako,32".
01 WS-NAME2 PIC X(10).
01 WS-KANA PIC X(10).
01 WS-AGE2 PIC X(3).
PROCEDURE DIVISION.
UNSTRING WS-CSV-LINE DELIMITED BY ","
INTO WS-NAME2 WS-KANA WS-AGE2.
DISPLAY WS-NAME2.
*> 結果: "Yamada"(カンマまでの部分がそれぞれの変数へ)
CSV形式のデータ(第7章で扱うファイル処理でよく登場します)を、カンマ区切りでフィールドごとに分解するのに便利です。
INSPECT文(検査・置換) … 文字の数を数えたり、置き換えたりします。
01 WS-TEXT PIC X(20) VALUE "AAABBBCCC".
01 WS-COUNT2 PIC 9(2) VALUE 0.
PROCEDURE DIVISION.
INSPECT WS-TEXT TALLYING WS-COUNT2 FOR ALL "B".
DISPLAY WS-COUNT2.
*> 結果: 03("B" が3個含まれている。WS-COUNT2 は PIC 9(2) なので2桁表示)
INSPECT WS-TEXT REPLACING ALL "B" BY "X".
DISPLAY WS-TEXT.
*> 結果: "AAAXXXCCC"
TALLYING ... FOR ALL "文字"… 指定した文字(または文字列)の出現回数を数える。REPLACING ALL "文字" BY "文字"… 指定した文字を別の文字に置き換える。
これら3つの命令(STRING・UNSTRING・INSPECT)は、テキストデータやCSVを扱うバッチ処理プログラムで非常によく使われます。
試すには
"Sato,Ichiro,45" のような文字列をUNSTRING文で氏名・名・年齢の3つの変数に分割し、STRING文で "氏名: Sato" のような文字列に組み立て直すコードを書いてみましょう。