技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

opensource COBOL:内部ソートサンプル

COBOLの内部ソート(COBOLプログラム内で行うソート処理)についてネット上の情報が少ないので、opensource COBOLでサンプルを作成しました。
また、サンプルを元に、文法に関する簡単な説明もつけました。
 
【サンプル】
       IDENTIFICATION    DIVISION.
       PROGRAM-ID.       SORTTEST.
       ENVIRONMENT       DIVISION.
       INPUT-OUTPUT      SECTION.
       FILE-CONTROL.   
           SELECT  F1  ASSIGN  TO  "C:\tmp\a.txt".
           SELECT  F2  ASSIGN  TO  "C:\tmp\b.txt".
           SELECT  FS  ASSIGN  TO  "C:\tmp\s.txt".
      *
       DATA                  DIVISION.
       FILE                  SECTION.
       FD  F1.
       01  F1R.
           03  F1-REC        PIC X(07).
       FD  F2.
       01  F2R.
           03  F2-REC        PIC X(07).
       SD  FS.
       01  FSR.
           03  FS-KEY        PIC X(01).
           03  FS-REC-DATA   PIC X(06).
      *
       WORKING-STORAGE       SECTION.
       01  WORK.
           03  F1-END        PIC X(01).
           03  FS-END        PIC X(01).
      *
       PROCEDURE         DIVISION.
      *
      * 各種処理の呼び出し
      *
       CONTROLLER-S.
           INITIALIZE WORK.
           SORT FS ON ASCENDING FS-KEY
                INPUT  PROCEDURE SORTIN-START  THRU SORTIN-END
                OUTPUT PROCEDURE SORTOUT-START THRU SORTOUT-END.
           STOP RUN.
       CONTROLLER-E.
      *
      * ソート前処理
      *
       SORTIN-START.
           OPEN  INPUT  F1.
           PERFORM READRELEASE-S THRU READRELEASE-E
               UNTIL F1-END = HIGH-VALUE.
           CLOSE  F1.
       SORTIN-END.
      *
      * インプットファイルREAD・ソートファイルRELEASE
      *
       READRELEASE-S.
           READ F1
           AT END
               MOVE HIGH-VALUE TO F1-END
               GO TO READRELEASE-E
           END-READ.
           MOVE F1R TO FSR.
           RELEASE FSR.
       READRELEASE-E.
      *
      * ソート前処理
      *
       SORTOUT-START.
           OPEN  OUTPUT F2.
           PERFORM RETURNWRITE-S THRU RETURNWRITE-E
               UNTIL FS-END = HIGH-VALUE.
           CLOSE  F2.
       SORTOUT-END.
      *
      * ソートファイルRETURN・アウトプットファイルWRITE
      *
       RETURNWRITE-S.
           RETURN FS
           AT END
               MOVE HIGH-VALUE TO FS-END
               GO TO RETURNWRITE-E
           END-RETURN.
           MOVE FSR TO F2R.
           WRITE F2R.
       RETURNWRITE-E.

【入力ファイル】
・a.txt
2fuga
3piyo
1hoge

【出力ファイル】
・b.txt
1hoge
2fuga
3piyo

【文法に関する補足】
・ASSIGN文でソート用の一時ファイルを定義する必要がある。
・SORT文の「ON 条件 ワーク名」でソートキーを指定することができる。条件については、「ASCENDING」なら昇順、「DESCENDING」なら降順となる。「条件 ワーク名」を繰り返して複数のキーを指定することもできる。
・SORT文はソート前に「INPUT  PROCEDURE」で定義したプロシージャを実行する。ここでは、RELEASE文でソート用の一時ファイルにレコードを書き込む。
・SORT文はソート後に「OUTPUT PROCEDURE」で定義したプロシージャを実行する。ここでは、ソート用の一時ファイルからRETURN文でレコードを読みだす。
(「INPUT  PROCEDURE」が終了後、「OUTPUT PROCEDURE」の開始前に、ソート用の一時ファイルに書き込まれたレコードはソートされる)