在幾乎所有面向業(yè)務(wù)的應(yīng)用程序中,對文件中的數(shù)據(jù)進行排序或合并兩個或多個文件是常見的需求。排序是用于以升序或降序排列記錄,以便可以執(zhí)行順序處理。有兩種技術(shù)用于在COBOL中排序文件:
外部排序:通過使用JCL中的SORT工具對文件進行排序。我們已經(jīng)在JCL章節(jié)中討論過。目前,我們將關(guān)注內(nèi)部排序。
內(nèi)部排序:用于對COBOL程序內(nèi)的文件進行排序。SORT動詞用于對文件進行排序。
在COBOL的排序進程中使用的三個文件:
Input file:是我們必須按升序或降序排序的文件。
Work file:用于在排序進程正在進行時保存記錄。輸入文件記錄被傳送到工作文件進行排序進程。該文件應(yīng)該在SD條目下的文件節(jié)(file section)中定義。
Output file:是我們在排序進程之后得到的文件。它是排序動詞的最終輸出。
以下是排序文件的語法:
SORT work-file ON ASCENDING KEY rec-key1 [ON DESCENDING KEY rec-key2] USING input-file GIVING output-file.
SORT執(zhí)行以下操作:
在I-O模式下打開work-file,在INPUT模式下打開input-file,在OUTPUT模式下打開output-file。
將input-file中存在的記錄傳送到work-file。
通過rec-key按升序/降序排序SORT-FILE。
將排序的記錄從work-file傳送到output-file。
關(guān)閉input-file和output-file,刪除work-file。
在下面的例子中,INPUT是需要按升序進行排序的輸入文件:
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INPUT ASSIGN TO IN. SELECT OUTPUT ASSIGN TO OUT. SELECT WORK ASSIGN TO WRK. DATA DIVISION. FILE SECTION. FD INPUT. 01 INPUT-STUDENT. 05 STUDENT-ID-I PIC 9(5). 05 STUDENT-NAME-I PIC A(25). FD OUTPUT. 01 OUTPUT-STUDENT. 05 STUDENT-ID-O PIC 9(5). 05 STUDENT-NAME-O PIC A(25). SD WORK. 01 WORK-STUDENT. 05 STUDENT-ID-W PIC 9(5). 05 STUDENT-NAME-W PIC A(25). PROCEDURE DIVISION. SORT WORK ON ASCENDING KEY STUDENT-ID-O USING INPUT GIVING OUTPUT. DISPLAY 'Sort Successful'. STOP RUN.
JCL執(zhí)行上述COBOL程序:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C //STEP1 EXEC PGM=HELLO //IN DD DSN=INPUT-FILE-NAME,DISP=SHR //OUT DD DSN=OUTPUT-FILE-NAME,DISP=SHR //WRK DD DSN=&&TEMP
當(dāng)你編譯和執(zhí)行上面的程序,會產(chǎn)生以下結(jié)果:
Sort Successful
使用合并語句組合兩個或多個相同順序的文件。合并過程中使用的文件:
以下是合并兩個或多個文件的語法:
MERGE work-file ON ASCENDING KEY rec-key1 [ON DESCENDING KEY rec-key2] USING input-1, input-2 GIVING output-file.
MERGE執(zhí)行以下操作:
在I-O模式下打開work-file,在INPUT模式下打開input-file,在OUTPUT模式下打開output-file。
將input-file中存在的記錄傳送到work-file。
通過rec-key按升序/降序排序SORT-FILE。
將排序的記錄從work-file傳送到output-file。
關(guān)閉input-file和output-file,刪除work-file。
在下面的例子中,INPUT1和INPUT2是要按升序合并的輸入文件:
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INPUT1 ASSIGN TO IN1. SELECT INPUT2 ASSIGN TO IN2. SELECT OUTPUT ASSIGN TO OUT. SELECT WORK ASSIGN TO WRK. DATA DIVISION. FILE SECTION. FD INPUT1. 01 INPUT1-STUDENT. 05 STUDENT-ID-I1 PIC 9(5). 05 STUDENT-NAME-I1 PIC A(25). FD INPUT2. 01 INPUT2-STUDENT. 05 STUDENT-ID-I2 PIC 9(5). 05 STUDENT-NAME-I2 PIC A(25). FD OUTPUT. 01 OUTPUT-STUDENT. 05 STUDENT-ID-O PIC 9(5). 05 STUDENT-NAME-O PIC A(25). SD WORK. 01 WORK-STUDENT. 05 STUDENT-ID-W PIC 9(5). 05 STUDENT-NAME-W PIC A(25). PROCEDURE DIVISION. MERGE WORK ON ASCENDING KEY STUDENT-ID-O USING INPUT1, INPUT2 GIVING OUTPUT. DISPLAY 'Merge Successful'. STOP RUN.
JCL執(zhí)行上述COBOL程序:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C //STEP1 EXEC PGM=HELLO //IN1 DD DSN=INPUT1-FILE-NAME,DISP=SHR //IN2 DD DSN=INPUT2-FILE-NAME,DISP=SHR //OUT DD DSN=OUTPUT-FILE-NAME,DISP=SHR //WRK DD DSN=&&TEMP
當(dāng)你編譯和執(zhí)行上面的程序,會產(chǎn)生以下結(jié)果:
Merge Successful
更多建議: