導入
COBOLのプログラムで、名前や住所のデータから余計な空白を取り除く処理は日常茶飯事ですよね。そんな時に便利なのが「TRIM関数」ですが、実はこの関数、「半角空白」しか認識してくれないという大きな落とし穴があります。現場で「データが入っているはずなのに空白が取れない!」と焦った経験はありませんか?この記事では、全角空白が混ざったデータでも正しく処理するための現実的な解決策を解説します。
基礎知識
COBOLの標準的なTRIM関数は、文字コードの「X’20’(半角スペース)」を対象に前後の空白を削除します。しかし、日本語環境では「X’8140’(全角スペース)」が使われることが多々あります。コンピュータにとって、半角と全角は全く別の文字として扱われるため、TRIM関数に全角スペースを渡しても「これは空白ではない」と判断され、そのまま残ってしまうのです。
実装/解決策
最も確実で現場でもよく使われる方法は、「全角空白を一度半角空白に変換してからTRIM関数にかける」という手法です。COBOLの「INSPECT CONVERTING」命令を使えば、文字列内の特定の文字を一括で置き換えることができます。
手順は以下の通りです。
1. INSPECT CONVERTING命令で、全角空白を半角空白に置換する。
2. その後、TRIM関数を使って前後の空白を削除する。
サンプルプログラム
以下のコードは、全角空白が含まれる文字列から、全角・半角両方の空白を適切に除去する例です。
PROGRAM-ID. TRIM-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WK-TEXT PIC X(20) VALUE ‘ COBOL ’. > 前後に全角空白あり
01 WK-RESULT PIC X(20).
PROCEDURE DIVISION.
> 1. 全角空白(X’8140′)を半角空白(X’20’)に変換する
INSPECT WK-TEXT CONVERTING X’8140′ TO X’20’.
> 2. 半角になった空白をTRIM関数で削除する
MOVE FUNCTION TRIM(WK-TEXT) TO WK-RESULT.
DISPLAY ‘処理前: [‘ WK-TEXT ‘]’
DISPLAY ‘処理後: [‘ WK-RESULT ‘]’
GOBACK.
応用・注意点
この手法の注意点は、「元のデータで全角空白を保持する必要があるか」を確認することです。もし全角空白がデータの一部(氏名の間の区切りなど)として重要な意味を持つ場合は、この変換を行うとすべて消えてしまいます。
また、古いコンパイラや特定のメインフレーム環境では、TRIM関数自体が使えない場合もあります。その際は、プログラムの最初から最後までをループで回し、全角空白の箇所を一つずつ判定してスペースで埋めるロジックが必要になります。現場の環境に合わせて、最も保守性の高い方法を選択してくださいね。

コメント