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」の開始前に、ソート用の一時ファイルに書き込まれたレコードはソートされる)