【COBOL学習|初心者向け】COBOLで文字列を小文字に変換!LOWER-CASE関数を使いこなそう

はじめに

COBOLでプログラムを書いていると、大文字と小文字が混在する文字列を扱う機会がありますよね。例えば、ユーザーからの入力や外部ファイルからのデータで、「ABC」と「abc」が同じ意味として扱いたい場合などです。そんな時に大活躍するのが、今回ご紹介する `LOWER-CASE` 関数です。この関数を使えば、文字列中のすべての大文字を小文字に変換できるので、大文字・小文字を区別せずに比較したり、検索したりすることが格段に楽になります。

LOWER-CASE関数って何?

`LOWER-CASE` 関数は、COBOLに標準で用意されている「組込関数」の一つです。その名の通り、引数として渡された文字列に含まれるすべての大文字を小文字に変換して返してくれます。これは、`UPPER-CASE` 関数(すべて小文字を大文字に変換する関数)の反対の働きをすると考えると分かりやすいでしょう。

例えば、
`FUNCTION LOWER-CASE(“Hello World”)`
と実行すると、
`”hello world”`
という結果が返ってきます。

この関数がなぜ重要かというと、前述の通り「正規化」という処理でよく使われるからです。正規化とは、データの表記揺れをなくして、同じ意味を持つデータを統一すること。大文字・小文字の区別をなくすことは、正規化の典型的な例です。これにより、検索処理などで「ABC」と「abc」を同じものとして扱えるようになるのです。

LOWER-CASE関数の使い方

`LOWER-CASE` 関数の使い方はとてもシンプルです。`FUNCTION LOWER-CASE(対象文字列)` のように記述します。

例えば、変数 `WS-INPUT-STRING` に格納されている文字列を小文字に変換して、別の変数 `WS-LOWER-STRING` に格納したい場合は、以下のように書くことができます。

MOVE FUNCTION LOWER-CASE(WS-INPUT-STRING) TO WS-LOWER-STRING.

また、条件分岐(IF文)の中で直接比較したい場合にも利用できます。例えば、変数 `A` と変数 `B` の内容を、大文字・小文字を区別せずに比較したい場合は、参考本文にあったように以下のように書けます。

IF FUNCTION LOWER-CASE(A) = FUNCTION LOWER-CASE(B)
DISPLAY “AとBは、大文字・小文字を区別しなければ同じ内容です。”
END-IF.

この書き方であれば、`A` が “Apple” で `B` が “apple” であっても、条件は真(正しい)となります。

サンプルプログラム

実際に `LOWER-CASE` 関数を使ってみましょう。以下のプログラムは、いくつかの文字列を `LOWER-CASE` 関数で小文字に変換し、その結果を表示する簡単な例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-LOWERCASE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-ORIGINAL-STRING1 PIC X(20) VALUE “Hello COBOL”.
01 WS-LOWER-STRING1 PIC X(20).
01 WS-ORIGINAL-STRING2 PIC X(20) VALUE “UPPER CASE EXAMPLE”.
01 WS-LOWER-STRING2 PIC X(20).
01 WS-ORIGINAL-STRING3 PIC X(20) VALUE “MixedCase123”.
01 WS-LOWER-STRING3 PIC X(20).

PROCEDURE DIVISION.
MAIN-PROCEDURE.
DISPLAY “— LOWER-CASE 関数 サンプル —“.

  • 1つ目の文字列を小文字に変換して表示

MOVE FUNCTION LOWER-CASE(WS-ORIGINAL-STRING1) TO WS-LOWER-STRING1.
DISPLAY “元の文字列1: ” WS-ORIGINAL-STRING1.
DISPLAY “小文字変換後1: ” WS-LOWER-STRING1.
DISPLAY “—————————–“.

  • 2つ目の文字列を小文字に変換して表示

MOVE FUNCTION LOWER-CASE(WS-ORIGINAL-STRING2) TO WS-LOWER-STRING2.
DISPLAY “元の文字列2: ” WS-ORIGINAL-STRING2.
DISPLAY “小文字変換後2: ” WS-LOWER-STRING2.
DISPLAY “—————————–“.

  • 3つ目の文字列を小文字に変換して表示 (数字や記号はそのまま)

MOVE FUNCTION LOWER-CASE(WS-ORIGINAL-STRING3) TO WS-LOWER-STRING3.
DISPLAY “元の文字列3: ” WS-ORIGINAL-STRING3.
DISPLAY “小文字変換後3: ” WS-LOWER-STRING3.
DISPLAY “—————————–“.

STOP RUN.

このプログラムを実行すると、以下のような出力が得られます。

— LOWER-CASE 関数 サンプル —
元の文字列1: Hello COBOL
小文字変換後1: hello cobol
—————————–
元の文字列2: UPPER CASE EXAMPLE
小文字変換後2: upper case example
—————————–
元の文字列3: MixedCase123
小文字変換後3: mixedcase123
—————————–

見ての通り、大文字がすべて小文字に変換されているのが分かりますね。数字や記号はそのまま維持されます。

応用と注意点

応用例:あいまい検索の実装

`LOWER-CASE` 関数は、ユーザーが入力した検索キーワードと、データベースなどのデータとを比較する際にあいまい検索を実現するのに役立ちます。

例えば、ユーザーが「apple」と入力した場合でも、「Apple」や「APPLE」といったデータも見つけたいとします。その場合、ユーザーの入力とデータベースのデータを両方とも `LOWER-CASE` 関数で小文字に変換してから比較すれば、大文字・小文字を区別しない検索が可能になります。

WORKING-STORAGE SECTION.
01 WS-USER-INPUT PIC X(50) VALUE “ApPlE”.
01 WS-DATA-FROM-DB PIC X(50) VALUE “Apple Pie”.
01 WS-SEARCH-RESULT PIC X(10).

PROCEDURE DIVISION.
IF FUNCTION LOWER-CASE(WS-USER-INPUT) IS CONTAINED IN FUNCTION LOWER-CASE(WS-DATA-FROM-DB)
MOVE “一致” TO WS-SEARCH-RESULT
ELSE
MOVE “不一致” TO WS-SEARCH-RESULT
END-IF.
DISPLAY “検索結果: ” WS-SEARCH-RESULT.
STOP RUN.

※ `IS CONTAINED IN` は、ある文字列が別の文字列に含まれているかを判定する例です。実際には、より複雑な検索ロジックになることが多いでしょう。

注意点:結果の格納先

`LOWER-CASE` 関数は、変換された文字列を「返してくれる」関数です。関数自体が元の文字列を直接書き換えるわけではありません。そのため、変換結果を保持したい場合は、必ず別の変数に `MOVE` するなどの処理が必要です。

また、変換後の文字列を格納する変数には、元の文字列と同じか、それ以上の文字数を格納できる `PIC` 句を指定してください。例えば、`PIC X(10)` の変数に、15文字の文字列を変換して格納しようとすると、データが切り捨てられてしまう可能性があります。

`LOWER-CASE` 関数は、COBOLでの文字列処理をより柔軟かつ効率的に行うための強力なツールです。ぜひ、皆さんのプログラムでも活用してみてください。

コメント

タイトルとURLをコピーしました