第8章数据的排序与合并.docx

上传人:b****1 文档编号:3088844 上传时间:2023-05-05 格式:DOCX 页数:31 大小:25.75KB
下载 相关 举报
第8章数据的排序与合并.docx_第1页
第1页 / 共31页
第8章数据的排序与合并.docx_第2页
第2页 / 共31页
第8章数据的排序与合并.docx_第3页
第3页 / 共31页
第8章数据的排序与合并.docx_第4页
第4页 / 共31页
第8章数据的排序与合并.docx_第5页
第5页 / 共31页
第8章数据的排序与合并.docx_第6页
第6页 / 共31页
第8章数据的排序与合并.docx_第7页
第7页 / 共31页
第8章数据的排序与合并.docx_第8页
第8页 / 共31页
第8章数据的排序与合并.docx_第9页
第9页 / 共31页
第8章数据的排序与合并.docx_第10页
第10页 / 共31页
第8章数据的排序与合并.docx_第11页
第11页 / 共31页
第8章数据的排序与合并.docx_第12页
第12页 / 共31页
第8章数据的排序与合并.docx_第13页
第13页 / 共31页
第8章数据的排序与合并.docx_第14页
第14页 / 共31页
第8章数据的排序与合并.docx_第15页
第15页 / 共31页
第8章数据的排序与合并.docx_第16页
第16页 / 共31页
第8章数据的排序与合并.docx_第17页
第17页 / 共31页
第8章数据的排序与合并.docx_第18页
第18页 / 共31页
第8章数据的排序与合并.docx_第19页
第19页 / 共31页
第8章数据的排序与合并.docx_第20页
第20页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

第8章数据的排序与合并.docx

《第8章数据的排序与合并.docx》由会员分享,可在线阅读,更多相关《第8章数据的排序与合并.docx(31页珍藏版)》请在冰点文库上搜索。

第8章数据的排序与合并.docx

第8章数据的排序与合并

第8章数据的排序与合并

本章主要介绍COBOL中数据的排序和合并功能。

其中在数据的排序一节中将首先介绍如何定义排序中间文件以及指定用于排序的输入输出文件。

此后,重点讲解如何使用SORT语句进行排序。

同时,在介绍完使用SORT语句排序后,还将介绍如何编写排序的输入输出过程。

最后,将介绍使用包含有输入输出过程的SORT语句进行排序。

对于数据的合并,本章将首先介绍如何指定用于排序的输入输出文件。

其后,介绍如何编写合并的输出过程。

最后,重点介绍如何使用MERGE语句进行合并。

8.1排序与合并概述

首先需要说明的一点是,本章讲解的排序与合并是COBOL中所自带的功能。

二者在此处并非指通常所说的排序与合并的算法。

同时,这里所说的排序与合并都是针对文件中的数据而言的。

因此,有的书上也将其称做文件的排序与合并。

8.1.1排序的基本概念

所谓数据的排序,就是将文件中的数据按一定的顺序进行重新排列。

COBOL中的文件数据实际上是由记录所组成的。

因此,对数据的排序实际上通常就是对记录的排序。

一条记录中往往含有多个数据项,将记录排序时,必须以一个或多个数据项为基准。

此处的数据项,也就是排序中所要用到的关键字。

例如,下面为一记录员工信息的文件。

文件中每条记录对应一个员工信息。

其中每个员工信息包括该员工的工号,姓名,住址,邮编。

该文件中的数据如下。

1235ZHUBOWUHAN430074

1024WUGUOJUNBEIJING100085

1346ZHANGXIANGSHENZHEN518057

1005XIEFEIWUHAN430023

1253XIEFEIWUHAN430022

此时,如果以员工工号作为关键字,并按照升序进行排序,则排序后的数据如下。

1005XIEFEIWUHAN430023

1024WUGUOJUNBEIJING100085

1235ZHUBOWUHAN430074

1253XIEFEIWUHAN430022

1346ZHANGXIANGSHENZHEN518057

如果按照员工工号的降序排列,则排序后的数据如下。

1346ZHANGXIANGSHENZHEN518057

1253XIEFEIWUHAN430022

1235ZHUBOWUHAN430074

1024WUGUOJUNBEIJING100085

1005XIEFEIWUHAN430023

此外,还可以按照员工的姓名排序。

由于存在重名现象,因此可以将工号作为第二关键字。

则若将员工姓名作为第一关键字按升序排列,将工号作为第二关键字按降序排列,排序结果将如下。

1024WUGUOJUNBEIJING100085

1253XIEFEIWUHAN430022

1005XIEFEIWUHAN430023

1346ZHANGXIANGSHENZHEN518057

1235ZHUBOWUHAN430074

由此可见,排序的结果主要是由两方面因素所决定的。

其中一方面因素是排序的方式。

排序方式分为升序和降序两种。

排序方式的不同将导致完全相反的排序结果。

另一方面因素是排序关键字的选取。

关键字选取的不同通常也将直接导致排序结果的不同。

以上谈到了排序的基本概念。

对于在COBOL中的实际开发,通常情况下,使用排序功能时主要需要用到以下3种文件。

❑排序输入文件。

该文件即排序操作的对象,其中包含用来进行排序的原始无序数据。

❑排序中间文件。

该文件是一个临时工作文件,仅用于排序操作。

该文件的功能是从排序输入文件得到原始数据,并将排序后的结果数据输出到排序输出文件中。

该文件在此处相当于一个临时缓冲区。

❑排序输出文件。

该文件保存排序后的结果,其中包含排序完成后的有序数据。

关于以上3种文件的使用方式以及排序功能的具体实现,将在后面的小节中进行详细讲解。

此处只需要了解COBOL中排序的基本概念。

8.1.2合并的基本概念

合并通常是指将两个及其以上的文件中的数据合并到一个新的文件中。

并且,用于合并的文件通常应该是已经排序过的文件。

合并后的文件中的数据也是有序数据。

实际上,合并也是基于相关数据的顺序而进行的操作。

例如,下面为其中一个用于合并的记录大型机从业人员信息的文件。

令文件中每条记录包括人员编号,姓名,公司,入职时间这几个数据项。

假设该文件中的具体数据如下。

001000WANGWEIIBMCDL2003/06/01

001003YUZHUEDS2007/07/05

001008ZHENGJICSTS2005/09/08

001010LIQIANGIBMCSDL2007/06/08

001025JIANGTAOIBMISSC2006/11/20

另一个用于合并的文件中的数据如下。

001004WANGWEIIBMTSS2002/06/20

001007YUZHUFDI2004/07/12

001012ZHENGJIISTC2007/09/15

将以上两文件按关键字为人员编号进行升序合并后,将生成一新的合并后的文件。

该合并后的文件中的数据将如下。

001000WANGWEIIBMCDL2003/06/01

001003YUZHUEDS2007/07/05

001004WANGWEIIBMTSS2002/06/20

001007YUZHUFDI2004/07/12

001008ZHENGJICSTS2005/09/08

001010LIQIANGIBMCSDL2007/06/08

001012ZHENGJIISTC2007/09/15

001025JIANGTAOIBMISSC2006/11/20

同样,类似于排序,合并在实际应用中也是需要3种文件的。

这3种文件分别为合并输入文件,合并中间文件,以及合并输出文件。

以上3种文件的概念和排序中3种文件的概念基本类似,只是此处是用于合并功能的。

最后需要补充的一点是,无论是排序还是合并,其结果并不是一定要保存在一个文件中的。

排序或合并的结果既可保存在多个文件中,也可不保存在任何文件中,而直接提供给程序进行处理。

8.2数据的排序

前面已经讲到,数据的排序实际上是对文件中的数据进行排序。

并且,用于排序的文件有3种,分别为排序中间文件,排序输入文件,以及排序输出文件。

本节将首先讲解如何实际应用以上3种文件。

其后,重点讲解在程序中是如何实际进行排序的。

在讲解完如何进行排序后,还将介绍通常是如何编写排序输入输出过程的。

最后,将讲解包含有输入输出过程的数据排序操作。

8.2.1使用SD语句定义排序中间文件

排序中间文件是一个临时工作文件,因此和普通的文件是不同的。

普通文件是通过在数据部的文件节中通过FD语句定义的。

而排序中间文件则是通过SD语句进行定义的。

其定义位置则仍然是在数据部的文件节中。

此处,不妨令在前面排序的基本概念一节中的员工信息文件为排序输入文件。

该文件内容为。

1235ZHUBOWUHAN430074

1024WUGUOJUNBEIJING100085

1346ZHANGXIANGSHENZHEN518057

1005XIEFEIWUHAN430023

1253XIEFEIWUHAN430022

假设对应以上内容需要定义的排序中间文件的文件名为“TEST-SORT-FILE”。

同任何文件一样,在使用SD语句定义该文件之前,首先需要在环境部进行指定。

指定方式如下。

……

ENVIRONMENTDIVISION.

INPUT-OUTPUTSECTION.

FILE-CONTROL.

SELECTTEST-SORT-FILE

ASSIGNTOS-SORT.

……

以上代码中的“S-SORT”为系统中所指定的一个文件名。

而“TEST-SORT-FILE”则是本COBOL程序编写中所用到的文件名。

两文件名对应同一个文件。

此外,为体现程序结构的完整性,该段代码中分别使用两个省略号表示程序中的其他部分。

其中前一个省略号表示标志部中的内容,后一个省略号表示环境部其他内容,及后面数据部中的内容。

在环境部指定该文件后,便可使用SD语句在数据部的文件节中进行相应定义了。

使用SD语句定义该文件的方式如下。

……

DATADIVISION.

FILESECTION.

SDTEST-SORT-FILE.

RECORDCONTAINS80CHARACTERS

DATARECORDISSORT-RECORD.

01SORT-RECORD.

05EMP-CODEPIC9(4).

05FILLERPICX(4)

VALUESPACES.

05EMP-NAMEPICX(17).

05FILLERPICXXX

VALUESPACES.

05EMP-ADDRPICX(12).

05FILLERPICX(4)

VALUESPACES.

05ADDR-CODEPIC9(6).

05FILLERPICX(30)

VALUESPACES.

……

同样,为体现程序结构的完整性,该段代码中也使用省略号表示其上下文内容。

其中前一个省略号表示环境部中的内容,后一个省略号表示数据部其他内容及过程部中的内容。

以上便完成了排序中间文件的定义。

关于所定义的排序中间文件,还有以下两点需要注意。

❑排序中间文件在SD语句定义之后必须包含有一条记录。

例如,上面例子中的记录就为“SORT-RECORD”。

❑排序中间文件仅用于排序操作。

也就是说,对于该文件而言,不能如通常文件一样对其进行输入输出操作。

8.2.2使用USING短语指定排序输入文件

排序输入文件实际上就是通常的文件,只是此处用于对该文件的数据进行排序而已。

也就是说,排序输入文件为排序功能提供了原始数据。

仍然使用前面员工信息文件的例子,则该文件作为排序输入文件,在程序数据部中的定义应该如下。

……

DATADIVISION.

FILESECTION.

FDTEST-INPUT-FILE.

01INPUT-RECORD.

05EMP-CODEPIC9(4).

05FILLERPICX(4)

VALUESPACES.

05EMP-NAMEPICX(17).

05FILLERPICXXX

VALUESPACES.

05EMP-ADDRPICX(12).

05FILLERPICX(4)

VALUESPACES.

05ADDR-CODEPIC9(6).

05FILLERPICX(30)

VALUESPACES.

……

对于以上定义的排序输入文件,此处重点需要说明其在排序操作中是如何应用的。

实际上,该文件是通过在用于排序功能的SORT语句里的USING短语所指定的。

指定位置在程序过程部的具体编码之中。

相关代码如下。

……

PROCEDUREDIVISION.

……

SORTTEST-SORT-FILE

ONASCENDINGKEYEMP-CODEOFSORT-RECORD

USINGTEST-INPUT-FILE/*此处指定排序输入文件*/

GIVINGTEST-OUTPUT-FILE.

……

关于USING短语,其在排序功能中的内部处理过程如下。

(1)打开与其后文件名相对应的排序输入文件。

(2)读取该排序输入文件的每一条记录。

(3)将读取的每一条记录释放到SORT排序之中去。

(4)关闭排序输入文件。

8.2.3使用GIVING短语指定排序输出文件

排序输出文件所定义的内部组织形式也必须和前两种文件一致,否则将无法将记录内容正确输出。

因此,对应于以上定义的排序中间文件和排序输入文件,此处的排序输出文件应定义如下。

……

DATADIVISION.

FILESECTION.

FDTEST-OUTPUT-FILE.

01OUTPUT-RECORD.

05EMP-CODEPIC9(4).

05FILLERPICX(4)

VALUESPACES.

05EMP-NAMEPICX(17).

05FILLERPICXXX

VALUESPACES.

05EMP-ADDRPICX(12).

05FILLERPICX(4)

VALUESPACES.

05ADDR-CODEPIC9(6).

05FILLERPICX(30)

VALUESPACES.

……

在实际排序中,以上所定义的排序输出文件是通过SORT语句里的GIVING短语指定的。

对照前面使用USING短语指定的排序输出文件,该文件在排序中的应用代码如下。

……

PROCEDUREDIVISION.

……

SORTTEST-SORT-FILE

ONASCENDINGKEYEMP-CODEOFSORT-RECORD

USINGTEST-INPUT-FILE

GIVINGTEST-OUTPUT-FILE./*此处指定排序输出文件*/

……

同样,GIVING短语在排序功能中的内部处理过程如下。

(1)打开与其后文件名相对应的排序输出文件。

(2)将排序中间文件里的每条记录顺次写入到该排序输出文件之中。

(3)关闭排序输出文件。

8.2.4使用SORT语句进行排序

在COBOL中对于数据的排序功能主要是通过SORT语句实现的。

使用SORT语句进行数据排序时,其排序的内部算法对于程序员是透明的。

也就是说,此时程序员只用指定排序的输入输出文件以及排序中间文件,并指定排序的关键字和排序方式。

具体如何实现排序,则由系统自动完成。

SORT语句的基本格式如下。

SORTsort-file-name

ONASCENDINGKEYsort-filed

USINGinput-file-name

GIVINGoutput-file-name.

该语句实际上在上两小节中也出现过。

此处关键需要注意该语句是如何指定排序关键字及排序方式的。

排序关键字及排序方式的指定方法如下。

❑通过“ONASCENDINGKEY”选项指定此处的排序方式为升序。

若要指定排序方式为降序,则通过“ONDESCENDINGKEY”指定。

❑通过“sort-filed”指定排序关键字。

其中该关键字为排序中间文件里所定义的一个数据项。

当用到多关键字排序时,此处相应有多个关键字名称。

下面给出完成一个文件数据排序的完整程序,用以更好地说明排序功能是如何具体实现的。

该程序代码如下。

IDENTIFICATIONDIVISION.

PROGRAM-ID.SORT-TEST-PROG.

AUTHER.XXX.

*

ENVIRONMENTDIVISION.

INPUT-OUTPUTSECTION.

FILE-CONTROL.

SELECTTEST-INPUT-FILE

ASSIGNTOS-SYSIN.

SELECTTEST-OUTPUT-FILE

ASSIGNTOS-SYSOUT.

SELECTTEST-SORT-FILE

ASSIGNTOS-SORT.

*

DATADIVISION.

FILESECTION.

SDTEST-SORT-FILE.

RECORDCONTAINS80CHARACTERS

DATARECORDISSORT-RECORD.

01SORT-RECORD.

05EMP-CODEPIC9(4).

05FILLERPICX(4)VALUESPACES.

05EMP-NAMEPICX(17).

05FILLERPICXXXVALUESPACES.

05EMP-ADDRPICX(12).

05FILLERPICX(4)VALUESPACES.

05ADDR-CODEPIC9(6).

05FILLERPICX(30)VALUESPACES.

*

FDTEST-INPUT-FILE.

01INPUT-RECORD.

05EMP-CODEPIC9(4).

05FILLERPICX(4)VALUESPACES.

05EMP-NAMEPICX(17).

05FILLERPICXXXVALUESPACES.

05EMP-ADDRPICX(12).

05FILLERPICX(4)VALUESPACES.

05ADDR-CODEPIC9(6).

05FILLERPICX(30)VALUESPACES.

*

FDTEST-OUTPUT-FILE.

01OUTPUT-RECORD.

05EMP-CODEPIC9(4).

05FILLERPICX(4)VALUESPACES.

05EMP-NAMEPICX(17).

05FILLERPICXXXVALUESPACES.

05EMP-ADDRPICX(12).

05FILLERPICX(4)VALUESPACES.

05ADDR-CODEPIC9(6).

05FILLERPICX(30)VALUESPACES.

*

PROCEDUREDIVISION.

SORTTEST-SORT-FILE

ONASCENDINGKEYEMP-NAMEOFSORT-RECORD

DESCENDINGKEYEMP-CODEOFSORT-RECORD

USINGTEST-INPUT-FILE

GIVINGTEST-OUTPUT-FILE.

STOPRUN.

该程序完整地实现了数据排序的功能。

程序中所定义的排序输入文件为TEST-INPUT-FILE,排序输出文件为TEST-OUTPUT-FILE。

排序中间文件则为通过SD语句定义的TEST-SORT-FILE。

如果假设排序输入文件TEST-INPUT-FILE中的数据内容如下。

1235ZHUBOWUHAN430074

1024WUGUOJUNBEIJING100085

1346ZHANGXIANGSHENZHEN518057

1005XIEFEIWUHAN430023

1253XIEFEIWUHAN430022

则该程序执行后,排序输出文件TEST-OUTPUT-FILE中将有如下数据。

1024WUGUOJUNBEIJING100085

1253XIEFEIWUHAN430022

1005XIEFEIWUHAN430023

1346ZHANGXIANGSHENZHEN518057

1235ZHUBOWUHAN430074

实际上,该程序用于排序的核心代码就是过程部中的SORT语句,语句如下。

SORTTEST-SORT-FILE

ONASCENDINGKEYEMP-NAMEOFSORT-RECORD

DESCENDINGKEYEMP-CODEOFSORT-RECORD

USINGTEST-INPUT-FILE

GIVINGTEST-OUTPUT-FILE.

该语句对应的功能分别如下。

❑指定排序输入文件为TEST-INPUT-FILE。

❑指定排序输出文件为TEST-OUTPUT-FILE。

❑指定排序中间文件为TEST-SORT-FILE。

❑指定排序中的第一关键字为SORT-RECORD记录中的EMP-NAME数据项。

❑指定第一关键字的排序方式为升序。

❑指定排序中的第二关键字为SORT-RECORD记录中的EMP-CODE数据项。

❑指定第二关键字的排序方式为降序。

根据其现实意义,该程序的处理过程如下。

(1)指定员工信息文件TEST-INPUT-FILE中的数据为原始数据。

(2)以原始数据记录中的员工姓名作为第一关键字,并按照升序排序。

(3)以原始数据记录中的员工工号作为第二关键字,并按照降序排序。

(4)将排序后的信息输出保存到TEST-OUT-FILE中。

该程序中的排序输入文件里的内容和8.1.1小节排序基本概念中所用到的文件一致。

并且,本程序中指定的排序关键字及其排序方式也是和该小节中的第3个排序例子是等同的。

因此,本程序最终得到的排序结果也和该小节中的第3个排序例子所得到的结果是一致的。

以上结合具体实例详细说明了在COBOL中是如何进行文件数据的排序的。

可以看到,在实际排序中对于文件的定义以及SORT语句的使用是最重要的。

此外还需补充的一点是,当排序中包含多个关键字,并且每一关键字的排序方式相同时,也可简化编码。

此时不必写明每一关键字所对应的排序方式,而只用指明第一个关键字的排序方式便可。

例如以下代码便将员工姓名,员工住址,员工工号分别作为第一,二,三关键字。

并且,所有关键字的排序方式都为升序。

该段代码如下。

SORTTEST-SORT-FILE

ONASCENDINGKEYEMP-NAMEOFSORT-RECORD

EMP-ADDROFSORT-RECORD

EMP-CODEOFSORT-RECORD

USINGTEST-INPUT-FILE

GIVINGTEST-OUTPUT-FILE.

最后,关于数据的排序,还有以下几点需要注意。

❑在OS/390和VM平台上使用COBOL进行排序时,必须具有IBM授予的DFSORT或相关权限。

❑数据排序中用到的排序输入文件,排序输出文件以及排序中间文件所定义的组织形式必须一致。

❑在完成排序之后,可使用包含有序数据的排序输出文件进行打印报表或者数据合并等操作。

此时,必须重新打开排序输出文件,并读取其中的数据以进行处理。

❑除使用COBOL中的SORT语句对文件数据进行排序外,也可使用JCL中的实用程序进行。

关于JCL将在本书的COBOL扩展篇中详细讲解。

8.2.5编写排序中的输入处理过程

排序中的输入处理过程是用于在排序之前对其输入的原始数据进行处理的。

通常来说,输入处理过程主要有以下3点用途。

❑在正式排序之前,对从排序输入文件中读入的原始数据进行筛选或者处理。

例如,若读入的一组数据为包含正负数在内的整型数据,可令其只对其中的正数进行排序。

或者,对所有数据进行乘方运算后再将其进行排序。

❑将程序中其他地方读入的数据作为排序的输入数据。

❑将工作存储节中的数据作为排序的输入数据。

在实际程序中,输入处理过程是通过SORT语句中的短语INPUTPROCEDURE表示的。

例如,下面这段代码就使用输入处理过程将工作存储节中的数据作为排序

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2