今回はCOBOLで変数内の空白を削除する方法について解説します。
目次
スペースの削除
COBOLで競プロなどをやっていると、文字を出力する際に、スペースが文字の前に出力されてしまうことに気がつくと思います。また、文字数をカウントする際には空白部分までがカウントされてしまうことがあります。
今回はその解決方法を紹介します。
FUNCTION TRIMで空白を削除
COBOLでは、FUNCTION TRIMを使用すると簡単に空白を削除することができます。
例
FUNCTION TRIM(SAMPLE).
これで、SAMPLE変数内の空白を削除することができる。
標準出力で使用したり、文字数のカウントをする際に使用することができる。
標準出力で空白削除
標準出力で空白を削除して出力するには下記のようにする。
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SAMPLE PIC X(6). *> 6文字の大きさを定義
PROCEDURE DIVISION.
MAIN SECTION.
MOVE " HELLO" TO SAMPLE. *> 「HELLO」の前にスペースを一文字置いている
DISPLAY SAMPLE. *> " HELLO"
DISPLAY FUNCTION TRIM(SAMPLE). *> "HELLO"
TRIMを使用することで、SAMPLE変数内に空白があった場合には、その空白(スペース)部分は出力されずに、文字の部分のみが出力されるようになる。
文字の間にスペースがあった場合
上記の例は、文字の前や後ろにスペースがあった場合の例である。
では、文字の間にスペースがあった場合はどうなるだろうか。
結論としては、文字の間のスペースは削除はされない。
「hello world」を「FUNCTION TRIM」で空白削除しても「hello world」となる。
文字数カウントの際の空白削除
文字数をカウントする際には、「FUNCTION LENGTH」を使用する。
ただ注意点がある、そのまま変数に使用すると空白の文字数部分もカウントしてしまい、空白を除いた文字数をカウントすることができなくなってしまう。そのため、「FUNCTION TRIM」を使用することで、空白部分を除外した文字数をカウントすることができる。
COMPUTE SAMPLE-LENG = FUNCTION LENGTH(FUNCTION TRIM(SAMPLE TRAILING).
実際にやってみる
IDENTIFICATION DIVISION.
program-id. Hello.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 A PIC 99 VALUES 12.
01 SAMPLE PIC XXXX.
01 A-CNT PIC 99.
01 B-CNT PIC 99.
PROCEDURE DIVISION.
MAIN SECTION.
DISPLAY A. *> "12"
MOVE A TO SAMPLE.
DISPLAY SAMPLE. *> "12 "
DISPLAY FUNCTION TRIM(SAMPLE). *> "12"
*> 空白を削除しない状態でカウントする
COMPUTE A-CNT = FUNCTION LENGTH(SAMPLE).
DISPLAY A-CNT. *> 04
*> 空白を削除した状態で文字数をカウントする
COMPUTE B-CNT = FUNCTION LENGTH(FUNCTION TRIM(SAMPLE)).
DISPLAY B-CNT. *> 02
STOP RUN.
上記のようにすることで、空白部分を無視した状態で文字数をカウントすることができます。
ゼロサプレスの際の空白削除(Z9)
続いて、ゼロサプレスを用いる際の空白削除についても解説していく。
上記で説明した文字変数削除のように、ゼロサプレスであっても空白を削除することができる。ゼロサプレスとは、変数定義の際に「Z9」と定義することで設定することができる。「Z」の部分には数値を入れることができます、入れないと標準出力した際にその部分はスペースが出力されることになります。下記は簡単な例です。
DATA DIVISION.
WORKING-STORAGE SECTION.
01 A PIC 99 VALUES 1.
01 B PIC 99 VALUES 99.
01 A-N PIC Z9.
01 B-N PIC Z9.
PROCEDURE DIVISION.
MAIN SECTION.
MOVE A TO A-N.
MOVE B TO B-N.
DISPLAY A-N. *> " 1"
DISPLAY B-N. *> "99"
上記のように、「Z」で定義した部分は、数値が入れば数値が出力され、数値が入らなければスペースが出力されることとなる。
しかし、数値以外の部分は出力したくないことは、競プロなどをやっていると発生してくる。その際には「FUNCTION TRIM」を指定することで、空白(スペース)を削除することができる。
DATA DIVISION.
WORKING-STORAGE SECTION.
01 A PIC 99 VALUES 1.
01 A-N PIC Z9.
PROCEDURE DIVISION.
MAIN SECTION.
MOVE A TO A-N.
DISPLAY A-N. *> " 1"
DISPLAY FUNCTION TRIM(A-N). *> "1"
以上が、ゼロサプレスの場合の空白削除です。