[COBOLのはじめ方] Part15: SORT文によるデータソート

COBOL

COBOLのSORT文をマスターして、大量データを効率的に並び替えよう!

SORT文とは? 🤔

COBOLプログラミングにおいて、ファイル内のレコードを指定したキー項目に基づいて昇順(小さい順)または降順(大きい順)に並び替える機能を提供するのが SORT文 です。大量のデータを扱う業務システムでは、データを特定の順序で処理したり、帳票を作成したりする場面が非常に多く、SORT文は不可欠な機能と言えるでしょう。✨

SORT文は、COBOLプログラム内部でソート処理を実行するため、外部のソートユーティリティを呼び出す必要がなく、プログラムの記述を簡潔に保つことができます。

ポイント: SORT文は、ファイル全体をメモリに読み込むのではなく、効率的なアルゴリズム(マージソートなどが一般的)を用いてディスク上でソート処理を行うため、非常に大きなファイルも扱うことができます。💾

基本的なSORT文の使い方 (USING / GIVING)

最も基本的なSORT文の使い方は、入力ファイル (USING句) を指定し、ソート結果を新しい出力ファイル (GIVING句) に書き出す形式です。

構文


SORT ソートファイル名
    ON { ASCENDING | DESCENDING } KEY データ名-1 [, データ名-2]...
    [WITH DUPLICATES IN ORDER]
    USING 入力ファイル名-1 [, 入力ファイル名-2]...
    GIVING 出力ファイル名-1.
      

各句の説明

説明
SORT ソートファイル名ソート処理で使用する作業用のファイルを指定します。このファイルは DATA DIVISIONFILE SECTION ではなく、SD (Sort Description) として定義する必要があります。
ON ASCENDING / DESCENDING KEYソートのキーとなる項目を指定します。ASCENDING は昇順、DESCENDING は降順です。複数のキーを指定することも可能で、その場合は指定した順序で優先的にソートされます。🔑
WITH DUPLICATES IN ORDER(任意) ソートキーが重複するレコードの相対的な順序を入力ファイルと同じに保ちたい場合に指定します。(指定しない場合、重複レコードの順序は保証されません)
USING 入力ファイル名ソート対象のデータが含まれる入力ファイルを指定します。DATA DIVISIONFILE SECTIONFD (File Description) として定義されたファイルを指定します。複数指定可能です。
GIVING 出力ファイル名ソート結果を書き出す出力ファイルを指定します。こちらも FD として定義されたファイルを指定します。

記述例

ここでは、「社員ファイル (INPUT-FILE)」を「社員番号 (EMP-ID)」の昇順でソートし、「ソート済み社員ファイル (OUTPUT-FILE)」に出力する例を見てみましょう。

まず、DATA DIVISION でファイル定義を行います。


ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT INPUT-FILE ASSIGN TO "input.dat".
    SELECT OUTPUT-FILE ASSIGN TO "output.dat".
    SELECT SORT-WORK-FILE ASSIGN TO "sortwork.wrk". *> ソート作業ファイル

DATA DIVISION.
FILE SECTION.
FD  INPUT-FILE.
01  INPUT-REC.
    05 EMP-ID       PIC 9(5).
    05 EMP-NAME     PIC X(20).
    05 DEPARTMENT   PIC X(10).

FD  OUTPUT-FILE.
01  OUTPUT-REC.
    05 OUT-EMP-ID   PIC 9(5).
    05 OUT-EMP-NAME PIC X(20).
    05 OUT-DEPT     PIC X(10).

SD  SORT-WORK-FILE. *> SD句でソートファイルを定義
01  SORT-REC.
    05 SORT-EMP-ID  PIC 9(5). *> キー項目
    05 FILLER       PIC X(30). *> キー以外の部分
      

次に、PROCEDURE DIVISION でSORT文を実行します。


PROCEDURE DIVISION.
MAIN-PROC.
    SORT SORT-WORK-FILE
        ON ASCENDING KEY SORT-EMP-ID *> 社員番号(昇順)をキーに
        USING INPUT-FILE            *> 入力ファイル指定
        GIVING OUTPUT-FILE.         *> 出力ファイル指定

    STOP RUN.
      

このプログラムを実行すると、”input.dat” ファイルが読み込まれ、社員番号でソートされた結果が “output.dat” ファイルに書き出されます。

INPUT PROCEDURE / OUTPUT PROCEDURE を使ったソート

USING/GIVING句はシンプルですが、ソート前後のデータに対して、レコードの選択や編集といった特別な処理を行いたい場合があります。そのような場合に活躍するのが INPUT PROCEDUREOUTPUT PROCEDURE です。

INPUT PROCEDURE

INPUT PROCEDURE は、ソート処理に渡すレコードをプログラム内で動的に生成したり、選択したりするための仕組みです。USING句の代わりに使用します。

  • 入力ファイルを読み込み、特定の条件を満たすレコードだけをソート対象にする。
  • 複数の入力ファイルをマージしながら、ソート対象レコードを生成する。
  • データベースや画面入力からデータを取得し、ソート対象とする。

INPUT PROCEDURE 内では、ソートファイルに対して RELEASE 文を使ってレコードを渡します。


* INPUT PROCEDURE の構文イメージ
SORT ソートファイル名
    ON { ASCENDING | DESCENDING } KEY データ名...
    INPUT PROCEDURE IS プロシジャ名-1 [THRU プロシジャ名-2]
    GIVING 出力ファイル名.
...
プロシジャ名-1 SECTION.
*   入力処理やレコード選択処理
    READ 入力ファイル AT END SET END-FLAG TO TRUE.
    PERFORM UNTIL END-FLAG = TRUE
*     条件判定など
      IF 条件 = TRUE THEN
          MOVE 入力レコード TO ソートレコード
          RELEASE ソートレコード *> ソートファイルへレコードを渡す
      END-IF
      READ 入力ファイル AT END SET END-FLAG TO TRUE
    END-PERFORM.
*   プロシジャの終了
      

OUTPUT PROCEDURE

OUTPUT PROCEDURE は、ソート処理が完了した後のレコードをプログラム内で受け取り、加工や編集を行ってから最終的な出力を行うための仕組みです。GIVING句の代わりに使用します。

  • ソート結果にヘッダーや集計行を追加して帳票を作成する。
  • ソート結果を特定のフォーマットに編集して出力ファイルに書き出す。
  • ソート結果を画面に表示したり、データベースに書き込んだりする。

OUTPUT PROCEDURE 内では、ソートファイルから RETURN 文を使ってソート済みレコードを1件ずつ受け取ります。


* OUTPUT PROCEDURE の構文イメージ
SORT ソートファイル名
    ON { ASCENDING | DESCENDING } KEY データ名...
    USING 入力ファイル名
    OUTPUT PROCEDURE IS プロシジャ名-3 [THRU プロシジャ名-4].
...
プロシジャ名-3 SECTION.
*   出力の初期処理(ヘッダ出力など)
    RETURN ソートファイル INTO 作業領域 *> ソート結果を1件受け取る
        AT END SET END-FLAG TO TRUE.
    PERFORM UNTIL END-FLAG = TRUE
*     レコードの編集や出力処理
      MOVE 作業領域 TO 出力レコード
      WRITE 出力レコード
      RETURN ソートファイル INTO 作業領域
          AT END SET END-FLAG TO TRUE
    END-PERFORM.
*   出力の終了処理(集計行出力など)
*   プロシジャの終了
      
注意: INPUT PROCEDUREOUTPUT PROCEDURE は、それぞれ USING句と GIVING句の代わりに使用します。両方を同時に指定することはできません(例:USINGOUTPUT PROCEDURE は組み合わせ可能)。これらを使うとプログラムは複雑になりますが、より柔軟なデータ処理が可能になります。🚀

キー指定の詳細 🔑

ON ASCENDING / DESCENDING KEY句では、ソートの基準となるキーを複数指定できます。


SORT SORT-WORK-FILE
    ON DESCENDING KEY SORT-DEPT-CODE  *> 第1キー: 部署コード (降順)
    ON ASCENDING KEY SORT-EMP-ID     *> 第2キー: 社員番号 (昇順)
    USING INPUT-FILE
    GIVING OUTPUT-FILE.
      

この例では、まず「部署コード」の降順でソートされ、同じ部署コード内では「社員番号」の昇順でソートされます。

  • 最初に指定したキーが最も優先度が高い(第1キー)。
  • キー項目は、ソートファイル (SD句で定義) のレコード内のデータ項目を指定します。
  • キー項目は、レコード内で連続している必要はありません。
  • ASCENDINGDESCENDING を混在させて指定できます。

まとめ

今回はCOBOLのSORT文について学びました。

  • SORT文はファイル内のレコードを並び替えるための強力な機能です。
  • 単純なソートは USING/GIVING句で簡単に実現できます。
  • ソート前後の処理が必要な場合は INPUT PROCEDUREOUTPUT PROCEDURE を活用します。
  • 複数のキーや昇順/降順を組み合わせて、複雑な並び替えも可能です。

SORT文は、COBOLによるバッチ処理開発において非常に重要な役割を果たします。ぜひ、実際にコードを書いて、その動きを確認してみてくださいね! 😊

参考情報

より詳しい情報や他のCOBOL機能については、以下のリソースも参考にしてください。

  • GnuCOBOL Programmer’s Guide: GnuCOBOL(旧OpenCOBOL)の公式マニュアルです。SORT文を含む、様々なCOBOLの文法や機能について詳細な説明があります。
    (※ 特定のURLはGnuCOBOLのバージョンや配布サイトによって変わるため、”GnuCOBOL Programmer’s Guide” で検索して最新版をご確認ください。)
  • 各種COBOL入門サイトや書籍: Web上や書籍で、COBOLのSORT文について解説している資料が多数あります。ご自身の学習スタイルに合ったものを見つけてみてください。

コメント

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