Cobol 需要看看我是否可以使用read语句来完成3种类型的输出吗?

Cobol 需要看看我是否可以使用read语句来完成3种类型的输出吗?,cobol,Cobol,我被要求编写程序来处理2个输入文件(客户和员工),匹配两个文件的键,并生成以下3个输出文件: 文件1:两个文件上的记录 文件2:记录在客户文件中,但不在员工文件中 文件3:记录在员工文件中,但不在客户文件中 设置“我的循环”是为了将客户文件中的一条记录与员工文件中的每条记录进行检查,然后从客户文件中获取另一个密钥对值,并重新开始该过程 目前: 匹配的记录-必须在文件1和文件2中(此功能) 在文件1中但不在文件2中的记录(不工作) 在文件2中但不在文件1中的记录(不工作) 问题:是否有一种方法

我被要求编写程序来处理2个输入文件(客户和员工),匹配两个文件的键,并生成以下3个输出文件

  • 文件1:两个文件上的记录
  • 文件2:记录在客户文件中,但不在员工文件中
  • 文件3:记录在员工文件中,但不在客户文件中
设置“我的循环”是为了将客户文件中的一条记录与员工文件中的每条记录进行检查,然后从客户文件中获取另一个密钥对值,并重新开始该过程

目前:

  • 匹配的记录-必须在文件1和文件2中(此功能)
  • 在文件1中但不在文件2中的记录(不工作)
  • 在文件2中但不在文件1中的记录(不工作)
  • 问题:是否有一种方法可以使用与当前相同的阅读段落一次性完成所有任务,而不必为每种文件比较类型重新运行JCL

    我发布的代码仅适用于匹配的案例

    代码:(记录布局——所有工作)


    我认为不可能用当前代码完成所有三项任务。如果文件包含1000000条记录,会发生什么情况。您将读取一个文件1000000次。这将需要永远才能完成(假设硬盘幸存下来)


    对于这种类型的处理,我建议使用排序合并过程:

    • 将文件排序为键序列
    • 对2个文件执行合并(对于3个文件,过程类似,只需执行更复杂的评估
    键序列中2个文件的处理逻辑变为:

     while not eof
        evaluate true
           when key-file1 < key-file2
             Write file1-record to output-file-2
             read file1
           when key-file1 > key-file2
             Write file2-record to output-file-3
             read file2
           when key-file1 = key-file2
                /* match processing, 
                   will involve reading at least one of the files */     
                move key-file1              to hold-key
                while key-file1 =  hold-key
                   Write Output-File-1
                   read file1
                end
                while key-file2 =  hold-key
                   read file2
                end
          end
     end
    
    而不是eof
    评价真实
    当key-file1key-file2
    将文件2记录写入输出文件3
    读取文件2
    当key-file1=key-file2时
    /*匹配处理,
    将涉及读取至少一个文件*/
    将key-file1移动到hold key
    而key-file1=保持键
    写入输出文件-1
    读取文件1
    结束
    而key-file2=保持键
    读取文件2
    结束
    结束
    结束
    
    将有文件结尾逻辑添加到


    注意:这个问题不清楚如何处理同一个密钥的多个条目

    您是用户3376708,还是您找到了他们的代码示例,还是COBOL最近被这样教授?从Bruce的回答和我的理解中可以看出,您的问题还很不清楚。您必须澄清所需处理的描述。另外,请出示您认为有效的代码。使用上面的内容,
    INFILE2
    将一直读取到文件末尾,第一条记录位于
    INFILE1
    上。然后呢?我希望你不要再
    关闭
    然后
    打开
    这个文件。这是我罗塞塔。这是我在主框架上使用的代码。这并不能真正教会我们边走边学。@user3491862我已经根据我对问题的理解更新了这个问题(来自你的答案)。你能看一下我的更新吗!!!这不是为其编写自定义COBOL代码的作业。考虑使用本地排序实用程序。SyncSort和DFSort都能够完成上面概述的任务。几乎每个大型机安装都有一个或另一个可用的实用程序。包含输入文件Employee1.txt和Customer.txt 2中所有匹配记录的文件。第二个文件是在Employee中但不在Customer中的所有记录。3.第三个文件是Customer中的所有记录,但不在Employee中。我有两个输入文件。Customer.txt--Employee.txt这是我比较过的两个文件。你需要更新你的问题(否则它将被关闭),并指定这三个文件以及它们之间的关系我已经更新了问题。有两个输入文件和三个输出文件。
    MATCH-INFILE1.                                                   
        READ INFILE1 INTO MAIN-LINE1                                 
           AT END                                                    
              MOVE 'Y' TO EOF1                                       
              GO TO X-INFILE1                                        
           NOT AT END                                                
              PERFORM READ-INFILE2 THRU X-INFILE2 UNTIL EOF2 = 'Y'   
        END-READ.                                                    
    X-INFILE1. EXIT.                                                 
    
    READ-INFILE2.                                                    
        READ INFILE2 INTO MAIN-LINE2                                 
          AT END                                                     
             MOVE 'Y' TO EOF2                                        
             GO TO X-INFILE2                                         
          NOT AT END                                                 
    
             PERFORM COMP-FILE THRU X-COMP-FILE  <-- I did not include this because 
                                                     I forgot to but can add it in in 
                                                     the morning when I have access 
                                                     to the mainframe. (simple compare)                     
        END-READ.                                                    
    X-INFILE2. EXIT.
    
    **107458982**       ****FM00000000000713432****CH   <-- discard the CH
    
    SD  **331067113**  **FFM00000000004556402**
    
     while not eof
        evaluate true
           when key-file1 < key-file2
             Write file1-record to output-file-2
             read file1
           when key-file1 > key-file2
             Write file2-record to output-file-3
             read file2
           when key-file1 = key-file2
                /* match processing, 
                   will involve reading at least one of the files */     
                move key-file1              to hold-key
                while key-file1 =  hold-key
                   Write Output-File-1
                   read file1
                end
                while key-file2 =  hold-key
                   read file2
                end
          end
     end