0

输入文件的格式是这样的:

Region  ******* Company Name  
  A               
  B            
  C            
  A          
  C      

有很多行。
我需要获取一个输出文件来重新排列带有如下标题的文件:

Company in Region A:  
name  
name  
name...  

Company in Region B:  
name  
name  
name..  

Company in Region C:  
name  
name  
name..  

我的问题是因为输入文件中的区域没有排序。如何在标题“A 区公司”中添加第二个 A 区公司?我只能读取一次文件(我不能首先对区域 A 执行所有行,然后重新打开文件以再次读取)。而且我只能有 1 个输出文件。

4

3 回答 3

3

您可以使用带有输入/输出过程的排序动词将文件排序为区域序列。

您可以在Google中找到许多示例。这个 ShorExample有一个简短的排序示例,这里有更多信息 您可能需要输入输出过程

排序示例:

PROCEDURE DIVISION. 
000-SORT SECTION. 
010-DO-THE-SORT. 
    SORT SORT-FILE ON ASCENDING KEY SORT-KEY-1 
                   ON DESCENDING KEY SORT-KEY-2 
                   USING INPUT-FILE 
                   OUTPUT PROCEDURE IS 200-WRITE-OUTPUT 
                                  THRU 230-DONE-OUTPUT. 
    DISPLAY "END OF SORT". 
    STOP RUN. 
200-WRITE-OUTPUT SECTION. 
210-OPEN-OUTPUT. 
    OPEN OUTPUT OUTPUT-FILE. 
220-GET-SORTED-RECORDS. 
    RETURN SORT-FILE AT END 
        CLOSE OUTPUT-FILE 
        GO TO 230-DONE-OUTPUT. 
    MOVE SORT-RECORD TO OUTPUT-RECORD. 
    WRITE OUTPUT-RECORD. 
    GO TO 220-GET-SORTED-RECORDS. 
230-DONE-OUTPUT SECTION. 
240-EXIT-OUTPUT. 
    EXIT. 
于 2014-10-30T02:39:22.910 回答
1

如果你正在做作业,请记住,作业的目的不是解决问题,而是证明你已经学习了课堂材料。因此,如果这是家庭作业,请根据所学内容创建自己的解决方案。如果您正在尝试解决现实生活中的问题,下面的示例可能会帮助您指明正确的方向。如果您没有学习过使用输出过程进行排序,那么您不想使用下面的示例来做功课。也就是说,以下程序使用 GNUCobol 显示的示例数据工作。请特别注意 SORT 如何使用段落 OUTPUT-CO-BY-REGION-REPORT。

--- 样本数据文件 COMPANY.DAT 的内容 ---

A WAL-MART
B EXXON
C CHEVRON
B BERKSHIRE
A APPLE
C GENERAL MOTORS

   IDENTIFICATION DIVISION.
   PROGRAM-ID. COMPANY-BY-REGION.

   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.

   SELECT COMPANY-FILE
       ASSIGN TO 'COMPANY.DAT'
       ORGANIZATION IS LINE SEQUENTIAL.

   SELECT COMPANY-SORT-FILE
       ASSIGN TO DISK.

   SELECT REGION-REPORT-FILE
       ASSIGN TO 'COMPANY-BY-REGION.RPT'
       ORGANIZATION IS LINE SEQUENTIAL.

   DATA DIVISION.
   FILE SECTION.

   FD  COMPANY-FILE.
   01  COMPANY-RECORD.
       02  COM-REGION                   PIC X.
       02  FILLER                       PIC X.
       02  COM-NAME                     PIC X(20).

   SD  COMPANY-SORT-FILE.
   01  COMPANY-SORT-RECORD.
       02  SORT-REGION                  PIC X.
       02  FILLER                       PIC X.
       02  SORT-NAME                    PIC X(20).

   FD  REGION-REPORT-FILE.
   01  REGION-REPORT-RECORD             PIC X(20).

   WORKING-STORAGE SECTION.

   01  SORTED-DATA-REMAINS              PIC X VALUE 'Y'.
       88  NO-SORTED-DATA-REMAINS       VALUE 'N'.

   01  WS-SORTED-RECORD.
       02  WS-REGION                    PIC X.
       02  FILLER                       PIC X.
       02  WS-NAME                      PIC X(20).

   01  REGION-REPORT-HEADER.
       02  FILLER PIC X(18) VALUE 'COMPANY IN REGION '.
       02  HEAD-REGION                  PIC X VALUE SPACE.
       02  FILLER                       PIC X VALUE ':'.

   01  REGION-DETAIL.
       02  DET-NAME                     PIC X(20).

   01  PRIOR-REGION                     PIC X.

   PROCEDURE DIVISION.
   WRITE-COMPANY-BY-REGION-REPORT.
       SORT COMPANY-SORT-FILE
           ASCENDING KEY SORT-REGION
                         SORT-NAME
           USING COMPANY-FILE
           OUTPUT PROCEDURE OUTPUT-CO-BY-REGION-REPORT
       STOP RUN
       .

   OUTPUT-CO-BY-REGION-REPORT.
       OPEN OUTPUT REGION-REPORT-FILE
       PERFORM UNTIL NO-SORTED-DATA-REMAINS
           RETURN COMPANY-SORT-FILE INTO WS-SORTED-RECORD 
               AT END SET NO-SORTED-DATA-REMAINS TO TRUE
               NOT AT END
                   PERFORM WRITE-COMPANY-RECORD
       END-PERFORM
       CLOSE REGION-REPORT-FILE
       .

   WRITE-COMPANY-RECORD.
       IF HEAD-REGION = SPACE 
       OR WS-REGION NOT = PRIOR-REGION
           PERFORM PRINT-HEADER
       END-IF
       MOVE WS-NAME TO DET-NAME
       WRITE REGION-REPORT-RECORD FROM REGION-DETAIL
       .

   PRINT-HEADER.
       IF HEAD-REGION NOT = SPACE
           MOVE SPACES TO REGION-REPORT-RECORD 
           WRITE REGION-REPORT-RECORD
       END-IF
       MOVE WS-REGION TO HEAD-REGION
                         PRIOR-REGION
       WRITE REGION-REPORT-RECORD FROM REGION-REPORT-HEADER
       .
于 2014-10-30T23:40:22.700 回答
0

您应该在文件的单遍中执行此操作。与其一次只检查一个项目,不如一次检查所有项目......

于 2014-10-30T01:05:46.803 回答