【COBOL】非数値データを操作するテクニック16選

COBOL非数値データ操作ガイドのイメージCOBOL
この記事は約19分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればサンプルコードを活用して機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

COBOL(Common Business-Oriented Language)は、ビジネスアプリケーションの開発に特化した高水準プログラミング言語です。

この記事では、COBOLにおける「非数値データ」の扱い方を解説します。

非数値データとは、数値ではない文字列や日付などのデータのことを指し、COBOLプログラミングではこのようなデータの操作が頻繁に行われます。

初心者でも理解しやすいように、基本的な概念から始めて徐々に応用に進んでいきます。

実際のプログラムコードを交えながら、その仕組みと使い方を順を追って説明していきますので、COBOLの基本から非数値データの操作技術までをこの記事で学ぶことができます。

●COBOLの基本と非数値データ

COBOLは1959年に開発された、ビジネス処理に特化した古くから存在するプログラミング言語です。

その特徴は、自然言語に近い文法を持ち、読みやすく、理解しやすいことにあります。

COBOLは主に金融、保険、政府機関などの大規模な商用システムで使用されてきました。

そのため、COBOLプログラミングでは、大量のデータ処理やファイル操作が重要な役割を果たします。

○COBOLとは

COBOLの基本構造は、DIVISION、SECTION、PARAGRAPHという階層的なコードブロックで構成されています。

プログラムは4つの主要なDIVISIONで構成されるのが一般的です。

IDENTIFICATION DIVISIONでプログラムの名前や説明を記述し、ENVIRONMENT DIVISIONではコンピュータのシステム環境に関する設定を行います。

DATA DIVISIONでは、プログラムで使用するデータの型や変数を定義し、PROCEDURE DIVISIONで実際の処理手順を記述します。

COBOLの文法は英語の文法に似ており、VERB(動詞)、NOUN(名詞)、CLAUSE(節)などの要素を使用してプログラムが書かれます。

○非数値データとは

非数値データとは、文字列や日付、時間など、数値以外のデータを指します。

COBOLでは、これらのデータ型を扱うための特別な宣言や操作方法が用意されています。

例えば、文字列は「PIC X(サイズ)」という形式で宣言され、サイズには文字列の長さを指定します。

非数値データはビジネスアプリケーションにおいて顧客の名前、住所、商品の説明など、様々な形で使用されます。

これらのデータを効率的に扱うことは、COBOLプログラミングにおいて非常に重要です。

●非数値データの宣言と基本操作

COBOLにおける非数値データの扱いは、プログラムの柔軟性と読みやすさに大きく貢献します。

非数値データの宣言は主にDATA DIVISIONで行われ、文字列や日付などのデータ型が利用されます。

非数値データは、プログラム内での情報の表示、加工、保存など様々な用途で使用されるため、これらを適切に扱うことが重要です。

○サンプルコード1:文字列の宣言と初期化

文字列データはCOBOLで広く使われるデータ型の一つです。

文字列は「PIC X(サイズ)」という形式で宣言され、サイズには文字列の長さを指定します。

例えば、10文字の文字列を宣言するには「PIC X(10)」と記述します。

初期化はMOVE文を使用して行われ、指定した文字列を変数に割り当てます。

01  文字列変数 PIC X(10).
    PROCEDURE DIVISION.
    MOVE 'Hello COBOL' TO 文字列変数.

このコードでは、「Hello COBOL」という文字列を10文字分の文字列変数に割り当てています。

この操作により、後続の処理で文字列変数を使用することができます。

○サンプルコード2:文字列の連結

COBOLでは、文字列の連結も簡単に行うことができます。

STRING文を使用して、複数の文字列を一つの文字列に連結することが可能です。

下記のサンプルコードは、二つの文字列を連結する方法を表しています。

01  文字列1 PIC X(10) VALUE 'Hello'.
01  文字列2 PIC X(10) VALUE 'COBOL'.
01  連結文字列 PIC X(20).

    PROCEDURE DIVISION.
    STRING 文字列1 DELIMITED BY SIZE
           文字列2 DELIMITED BY SIZE
           INTO 連結文字列.

このコードでは、’Hello’と’COBOL’という二つの文字列を連結して、20文字分の「連結文字列」に格納しています。

STRING文におけるDELIMITED BY SIZEは、文字列の実際の長さまでを連結の対象とすることを意味します。

●条件分岐と非数値データの活用

COBOLプログラミングにおいて、条件分岐はデータの処理方法を決定する重要な要素です。

特に非数値データを扱う際には、その内容に応じて異なる処理を行う必要があります。

これにより、プログラムはより動的で柔軟な挙動を表すことができます。

COBOLでは、IF文を使った基本的な条件分岐のほかに、SELECT文やEVALUATE文を使用してより複雑な条件分岐を行うことができます。

○サンプルコード3:条件文での文字列比較

文字列の比較は、条件分岐においてよく使われる技術の一つです。

例えば、特定の文字列がある条件を満たすかどうかに基づいて、異なる処理を実行する場合に利用されます。

ここでは、COBOLにおけるIF文を使った文字列比較のサンプルコードを紹介します。

01  文字列変数 PIC X(10) VALUE 'Hello'.
    PROCEDURE DIVISION.
    IF 文字列変数 = 'Hello' THEN
        DISPLAY '挨拶はHelloです'
    ELSE
        DISPLAY '別の挨拶です'.

このコードでは、文字列変数が’Hello’と等しい場合に特定のメッセージを表示し、それ以外の場合は別のメッセージを表示します。

これにより、プログラムの実行中にデータの内容に基づいた特定のアクションを取ることが可能になります。

○サンプルコード4:選択文(CASE)を使った処理

COBOLでは、EVALUATE文を使用することで、多岐にわたる条件分岐を簡潔に記述することができます。

これは他言語のCASE文やSWITCH文と似た機能を提供します。以下は、EVALUATE文を使用したサンプルコードです。

01  曜日 PIC X(10) VALUE '月曜日'.
    PROCEDURE DIVISION.
    EVALUATE 曜日
    WHEN '月曜日'
        DISPLAY '週の始まりです'
    WHEN '金曜日'
        DISPLAY '週末です'
    WHEN OTHER
        DISPLAY '平日です'.

このコードでは、’曜日’変数の内容に応じて異なるメッセージを表示します。

月曜日と金曜日では特定のメッセージを、それ以外の場合は別のメッセージを出力します。

EVALUATE文を使用することで、複数の条件を簡潔に管理し、プログラムの可読性を高めることができます。

●ループと非数値データの操作

COBOLプログラミングにおいて、ループは繰り返し処理を行うために欠かせない要素です。

特に非数値データを扱う際には、ループを利用してデータを効率的に処理することが多々あります。

COBOLではPERFORM文を使ってループ処理を実装することができ、この文は特定の条件が満たされるまで、または指定された回数だけ、特定の処理を繰り返します。

○サンプルコード5:ループ内での文字列操作

ループを使って文字列を操作する一例として、文字列内の特定の文字を数える処理があります。

下記のサンプルコードは、文字列内の特定の文字の出現回数をカウントする方法を表しています。

01  文字列 PIC X(100) VALUE 'Hello COBOL'.
01  カウンタ PIC 9(4) VALUE ZERO.
01  インデックス PIC 9(4) VALUE 1.

    PROCEDURE DIVISION.
    PERFORM UNTIL インデックス > LENGTH OF 文字列
        IF 文字列(インデックス:1) = 'O'
            ADD 1 TO カウンタ
        END-IF
        ADD 1 TO インデックス
    END-PERFORM.
    DISPLAY 'Oの数: ' カウンタ.

このコードでは、’Hello COBOL’という文字列内の’O’の文字数をカウントしています。

PERFORM文を使ったループにより、文字列の各文字を順に調べ、’O’が見つかるたびにカウンタを増やしています。

○サンプルコード6:文字列の検索と置換

文字列内で特定の文字列を検索し、それを別の文字列で置換する処理もCOBOLで実装可能です。

ここでは、文字列内の特定の部分文字列を別の文字列で置換するサンプルコードを紹介します。

01  元の文字列 PIC X(20) VALUE 'Hello COBOL World'.
01  置換後の文字列 PIC X(20).
01  インデックス PIC 9(4) VALUE ZERO.

    PROCEDURE DIVISION.
    MOVE 元の文字列 TO 置換後の文字列
    PERFORM VARYING インデックス FROM 1 BY 1 UNTIL インデックス > LENGTH OF 元の文字列 - 4
        IF 元の文字列(インデックス:5) = 'COBOL'
            MOVE 'Basic' TO 置換後の文字列(インデックス:5)
        END-IF
    END-PERFORM.
    DISPLAY '置換後の文字列: ' 置換後の文字列.

このコードでは、’Hello COBOL World’という文字列内の’COBOL’という部分を’Basic’で置換しています。

PERFORM文とVARYING句を組み合わせることで、文字列内を検索し、条件に一致する部分を置換しています。

●配列と非数値データ

COBOLでは、非数値データを効率的に扱うために配列を使用することができます。

配列は、同じ型の複数のデータを一つの変数名で管理するためのデータ構造です。

これにより、大量のデータを効率的に処理することが可能になります。

特に、文字列データなどの非数値データを配列として扱うことで、データの検索、ソート、集計などの操作が容易になります。

○サンプルコード7:文字列の配列

文字列の配列を使用することで、複数の文字列データを効率的に扱うことができます。

下記のサンプルコードは、文字列の配列を宣言し、それを利用する方法を表しています。

01  文字列配列。
    05  項目 PIC X(10) OCCURS 5 TIMES.

    PROCEDURE DIVISION.
    MOVE 'Apple' TO 項目(1).
    MOVE 'Banana' TO 項目(2).
    MOVE 'Cherry' TO 項目(3).
    MOVE 'Date' TO 項目(4).
    MOVE 'Elderberry' TO 項目(5).

このコードでは、5つの要素を持つ文字列の配列を宣言し、それぞれの要素に異なる文字列を格納しています。

OCCURS句を使用することで、指定された数だけ配列要素を作成できます。

○サンプルコード8:配列の検索とソート

配列の中から特定の要素を検索したり、配列を特定の順序でソートしたりすることも可能です。

下記のサンプルコードでは、配列内のデータを検索し、その結果に基づいてソートを行う方法を表しています。

01  文字列配列。
    05  項目 PIC X(10) OCCURS 5 TIMES.
01  インデックス PIC 9(4) VALUE ZERO.
01  一時変数 PIC X(10).

    PROCEDURE DIVISION.
    * 配列の初期化
    * ...(上記サンプルコード7と同様の初期化コード)...

    * 配列のソート
    PERFORM WITH TEST AFTER VARYING インデックス FROM 1 BY 1 UNTIL インデックス > 4
        IF 項目(インデックス) > 項目(インデックス + 1)
            MOVE 項目(インデックス) TO 一時変数
            MOVE 項目(インデックス + 1) TO 項目(インデックス)
            MOVE 一時変数 TO 項目(インデックス + 1)
        END-IF
    END-PERFORM.

このコードでは、簡単なバブルソートアルゴリズムを使用して、文字列配列内の要素をソートしています。

PERFORM文とIF文を組み合わせることで、配列の各要素を順番に比較し、必要に応じて要素の位置を交換しています。

●ファイル操作と非数値データ

COBOLプログラミングにおけるファイル操作は、データの保存や取得に不可欠です。

特に非数値データを扱う場合、ファイルからのデータ読み込みやファイルへのデータ書き込みは一般的な処理です。

COBOLでは、これらの操作を行うための特別な文法が用意されており、効率的なデータ管理を実現します。

○サンプルコード9:ファイルからの文字列読み込み

ファイルから文字列を読み込むには、ファイルをオープンし、READ文を使用してデータを読み込みます。

下記のサンプルコードは、ファイルから文字列データを読み込む一例を表しています。

01  文字列データ PIC X(100).
    SELECT 文字列ファイル ASSIGN TO 'データファイル.txt'.

    PROCEDURE DIVISION.
    OPEN INPUT 文字列ファイル.
    READ 文字列ファイル INTO 文字列データ.
    DISPLAY '読み込んだデータ: ' 文字列データ.
    CLOSE 文字列ファイル.

このコードでは、’データファイル.txt’というファイルから文字列データを読み込み、画面に表示しています。

OPEN文でファイルを開き、READ文でデータを読み込んだ後、CLOSE文でファイルを閉じています。

○サンプルコード10:ファイルへの文字列書き込み

ファイルへの文字列の書き込みも、COBOLプログラミングにおいて頻繁に行われる操作です。

下記のサンプルコードでは、文字列データをファイルに書き込む方法を表しています。

01  書き込む文字列 PIC X(100) VALUE 'Hello COBOL'.
    SELECT 出力ファイル ASSIGN TO '出力データファイル.txt'.

    PROCEDURE DIVISION.
    OPEN OUTPUT 出力ファイル.
    WRITE 出力ファイル FROM 書き込む文字列.
    CLOSE 出力ファイル.

このコードでは、’出力データファイル.txt’というファイルに’Hello COBOL’という文字列を書き込んでいます。

OPEN文でファイルを開き、WRITE文でデータを書き込んだ後、CLOSE文でファイルを閉じるという流れで操作が行われます。

●データベースと非数値データ

COBOLプログラムにおいてデータベースの活用は、非数値データの管理における重要な要素です。

データベースとの連携を通じて、大量のデータを効率的に保存、取得、更新することが可能となります。

COBOLでは、SQLや特定のデータベース管理システムと連携する機能を持つことが多く、これによりプログラムがより強力かつ柔軟なデータ処理能力を持つことができます。

○サンプルコード11:データベースへの文字列書き込み

データベースへの文字列データの書き込みは、情報の永続化に不可欠です。

下記のサンプルコードでは、COBOLプログラムからデータベースに文字列データを書き込む方法を表しています。

EXEC SQL
    CONNECT TO データベース名
END-EXEC.

EXEC SQL
    INSERT INTO テーブル名 (カラム名) VALUES ('Hello COBOL')
END-EXEC.

EXEC SQL
    COMMIT
END-EXEC.

EXEC SQL
    DISCONNECT
END-EXEC.

このコードでは、SQL文を使用してデータベースに接続し、指定されたテーブルに新しいレコードを追加しています。

‘Hello COBOL’という文字列がデータベースの特定のカラムに格納されます。

コミットを行った後、データベースとの接続を切断します。

○サンプルコード12:データベースからの文字列読み込み

データベースから文字列データを読み込むことも、一般的な操作です。

下記のサンプルコードでは、データベースから特定の文字列データを取得する方法を表しています。

01  取得データ PIC X(100).

EXEC SQL
    CONNECT TO データベース名
END-EXEC.

EXEC SQL
    SELECT カラム名 INTO :取得データ FROM テーブル名 WHERE 条件
END-EXEC.

DISPLAY 'データベースから取得したデータ: ' 取得データ.

EXEC SQL
    DISCONNECT
END-EXEC.

このコードでは、データベースから特定の条件に基づいてデータを選択し、プログラム内の変数に格納しています。

その後、取得したデータを表示し、データベースとの接続を切断しています。

データベースからのデータ読み込みは、様々なビジネスアプリケーションにおいて重要な役割を果たします。

●エラー処理と非数値データ

COBOLプログラミングにおけるエラー処理は、特に非数値データを扱う際に重要です。

エラーが発生した場合に適切に対応することで、プログラムの安定性や信頼性を高めることができます。

エラー処理は、不正なデータの入力や外部からの予期せぬ操作によるプログラムの中断を防ぐためにも不可欠です。

○サンプルコード13:エラーハンドリング

下記のサンプルコードでは、COBOLでの基本的なエラーハンドリングの方法を表しています。

PROCEDURE DIVISION.
    PERFORM 入力処理
    ON EXCEPTION
        DISPLAY "エラーが発生しました。"
        PERFORM エラー処理ルーチン
    END-PERFORM.

    STOP RUN.

入力処理.
    EXEC SQL
        SELECT * FROM テーブル名
    END-EXEC
    ON EXCEPTION
        DISPLAY "データベースエラーです。"
        MOVE 1 TO SQLCODE
    END-EXEC.

このコードでは、データベースからデータを取得する際にエラーが発生した場合、エラーメッセージを表示し、別のルーチン(エラー処理ルーチン)を実行します。

エラーが発生したことを検出し、適切に対応することが重要です。

○サンプルコード14:エラー処理の応用

エラー処理の応用例として、下記のサンプルコードでは、複数のエラー処理を組み合わせて使用する方法を表しています。

PROCEDURE DIVISION.
    PERFORM データ処理
    ON EXCEPTION
        DISPLAY "エラーが発生しました。"
        EVALUATE SQLCODE
            WHEN 100
                DISPLAY "データが見つかりません。"
            WHEN OTHER
                DISPLAY "予期せぬエラーです。"
        END-EVALUATE
    END-PERFORM.

データ処理.
    EXEC SQL
        SELECT * FROM テーブル名 WHERE 条件
    END-EXEC
    ON EXCEPTION
        MOVE SQLCODE TO SQLエラーコード
    END-EXEC.

このコードでは、SQLの実行中に発生したエラーを捉え、SQLCODE(SQLのエラーコード)に基づいて異なるメッセージを表示します。

エラーの種類に応じて適切な対応をすることで、プログラムの堅牢性を向上させることが可能です。

エラー処理の方法は多岐にわたるため、具体的なエラー状況やプログラムの要件に応じて適切な処理を選択することが重要です。

●最適化とパフォーマンス

COBOLプログラミングにおいて、最適化とパフォーマンスの向上は重要な要素です。

特に大規模なデータ処理や長時間動作するアプリケーションでは、効率的なコードの書き方がシステム全体のパフォーマンスに大きな影響を与えます。

最適化では、不必要な処理を減らし、効率的なデータ構造やアルゴリズムの選択が求められます。

○サンプルコード15:パフォーマンスの向上

下記のサンプルコードは、COBOLでのパフォーマンス向上のための一例です。

PROCEDURE DIVISION.
    PERFORM 大量データ処理 VARYING インデックス FROM 1 BY 1 UNTIL インデックス > データ数
    END-PERFORM.

大量データ処理.
    MOVE 大量データ (インデックス) TO 処理データ
    IF 処理データ > 基準値 THEN
        PERFORM 何らかの処理
    END-IF.

このコードは、大量のデータを効率的に処理するためにループを使用しています。

ループ内の条件分岐は、必要最小限に抑えることで処理速度の向上を図っています。

○サンプルコード16:最適化技術

最適化技術の応用例として、下記のサンプルコードでは、効率的なデータアクセス方法を表しています。

PROCEDURE DIVISION.
    PERFORM データ処理 USING データセット
    END-PERFORM.

データ処理 USING データセット.
    EXEC SQL
        FETCH NEXT FROM カーソル INTO :データセット
    END-EXEC
    PERFORM UNTIL SQLCODE NOT = 0
        EVALUATE SQLCODE
            WHEN 0
                PERFORM 処理ルーチン USING データセット
            WHEN OTHER
                DISPLAY "エラー: " SQLCODE
        END-EVALUATE
        EXEC SQL
            FETCH NEXT FROM カーソル INTO :データセット
        END-EXEC
    END-PERFORM.

このコードでは、データベースからデータを効率良く読み取り、各データに対して処理を行っています。

FETCH文を使用することで、必要なデータのみを効率的に処理し、パフォーマンスの向上を図っています。

まとめ

この記事では、COBOLプログラミングにおける非数値データの操作について、基本的な宣言から高度な最適化技術まで、幅広く解説しました。

非数値データの効果的な扱い方を理解し、適切なテクニックを適用することで、COBOLプログラムの効率とパフォーマンスを大幅に向上させることが可能です。

本ガイドが、COBOLプログラミングの基礎から応用までを学び、スキルを磨く上で役立つことを願っています。