使用Easytrieve/Cobol删除/省略多个记录

使用Easytrieve/Cobol删除/省略多个记录,cobol,mainframe,easytrieve,Cobol,Mainframe,Easytrieve,让我们假设我有一个文件a,其中包含以下数据: A1.01 A2.02 A4.03 A6.01 以及具有以下数据的文件B: A2.02 xyshahaslsl A2.02 dkjhsldhsds A2.02 ewewhrewjws A4.03 wejwejwrewl A4.03 wejedededee A5.01 kdkgskhdgss A5.02 fljsdfjdfjd A5.03 sdjdhsdhsld A7.04 jhsdhskdhsd A

让我们假设我有一个文件a,其中包含以下数据:

A1.01  
A2.02  
A4.03   
A6.01
以及具有以下数据的文件B:

A2.02 xyshahaslsl  
A2.02 dkjhsldhsds  
A2.02 ewewhrewjws  
A4.03 wejwejwrewl  
A4.03 wejedededee  
A5.01 kdkgskhdgss  
A5.02 fljsdfjdfjd  
A5.03 sdjdhsdhsld  
A7.04 jhsdhskdhsd  
A7.07 dsjdhslkhds  
如果它与第二个文件记录的前两个字母数据相匹配,则需要从文件B中删除文件A中的记录

因此,输出应该如下所示:

A5.01 kdkgskhdgss  
A5.02 fljsdfjdfjd  
A5.03 sdjdhsdhsld  
A7.04 jhsdhskdhsd  
A7.07 dsjdhslkhds 
我有文件A有400条记录,文件B有50万条记录。我运行了一个COBOL程序,但它运行的时间太长了

cobol程序逻辑如下:
这里我将50万条记录作为一个文件。
包含400条记录的文件称为文件B

WORKING-STORAGE SECTION.                         
01 WS-RECORDS-WRITTEN    PIC 9(8) VALUE ZEROES.  
01 WS-RECORDS-DELETED    PIC 9(8) VALUE ZEROES.  
01 WS-INSERT-FILE-STATUS PIC X(2).               
01 WS-EOFA PIC A(1) VALUE 'N'.                   
01 WS-EOFB PIC A(1) VALUE 'N'.                   
01 WS-FLAG-FOUND PIC A(1) VALUE 'N'. 



PROCEDURE DIVISION.                                    
MAIN-PARA.                                             
     OPEN INPUT IFILEA                                 
     OPEN OUTPUT OFILE                                 
     PERFORM PARA0 THRU PARA0-EXIT UNTIL WS-EOFA = "Y" 
     CLOSE IFILEA                                      
     CLOSE OFILE                                       
     STOP RUN.                                         
     EXIT.                                             
PARA0.                                                 
     READ IFILEA                                       
     AT END MOVE "Y" TO WS-EOFA                        
     END-READ                                          
     IF WS-EOFA = "N"                                  
        OPEN INPUT IFILEB                              
       MOVE "N" TO WS-EOFB                             
       MOVE "N" TO WS-FLAG-FOUND                       
         PERFORM PARA1 THRU PARA1-EXIT UNTIL WS-EOFB = "Y"  
             OR WS-FLAG-FOUND = "Y"                         
         IF WS-FLAG-FOUND = "N"                             
            WRITE F2RECORD FROM F0RECORD                    
         END-IF                                             
        CLOSE IFILEB                                        
      END-IF.                                               
 PARA0-EXIT.                                                
      EXIT.                                                 
 PARA1.                                                     
      READ IFILEB                                           
      AT END MOVE "Y" TO WS-EOFB                            
      END-READ                                              
      IF OSS024S-TRACKING-ID = OSS024V-REC                  
* SKIP THE RECORD                                           
        MOVE "Y" TO WS-FLAG-FOUND                           
      END-IF.                                               
 PARA1-EXIT.                                                
      EXIT.   

[为清晰起见,添加了示例文件控件、文件节和所需的工作存储。
跟随弹跳球寻找其他涉及的文件。引用的文件名用于我的测试。为简洁起见,仅提供示例]

文件控制。
选择文件A分配给“Q30309414.EXC”
组织是按行顺序的
文件状态为文件状态。
文件部分。
FD文件-A。
01文件A-REC。
05文件-字段PIC X(02)。
05填料图X(18)。
工作存储部分。
01文件状态图X(02)。
88 EOF-A值“10”。
主线。
打开输入文件-A。
打开输入文件-B。
打开输出文件-O。
将低值移动到FILE-A-REC。
执行读取和过滤
直到EOF-B。
关闭文件A。
关闭文件-B。
关闭文件-O。
停,跑。
读并过滤。
在末尾读取文件-B将高值移动到文件-B-REC。
执行读取下一个过滤器
直到FILE-B-FIELD不大于FILE-A-FIELD。
如果FILE-B-FIELD小于FILE-A-FIELD
从FILE-B-REC写入FILE-O-REC。
读取下一个过滤器。
如果FILE-B-FIELD大于FILE-A-FIELD
读取文件A
最后,将高值移动到FILE-A-REC。
不需要任何标志,只需要文件状态。当然,不需要创建依赖于布局的代码的邪恶执行过程


这假设您的数据按照您所指示的顺序进行排序。如果不是,那么方法就不同了——将有问题的排除文件字段(两个字符)读入工作存储表,对该表进行排序并搜索与读取的每个主文件记录的匹配项。

实际数据如上图所示,已更新。我尝试了EasyTrive的匹配,但许多记录没有被遗漏。我无法从家访问我的主机。我会努力回忆我写的东西。或者8小时后我有办公室。我一定会发布。是的,你是对的,我正在一次又一次地打开和关闭400条记录,大约50万次。我检查发现我的文件A没有正确排序。我把它分类了,EasyTrive Match很好用。非常感谢。别忘了那些接受(比如马古在这里),然后投票。非常感谢。我正在使用EasyTrive Match。它非常快,我称之为“横向匹配”,并且更喜欢“传统的”两文件匹配结构。需要注意文件区域:EOF后无法更改它们。如果小文件未排序并且在内存中排序,您仍然可以使用上面的代码按顺序处理表。进行二进制搜索将是不必要的开销。非常感谢比尔·伍德格。我将尝试代码并向您发送消息。