使用Easytrieve/Cobol删除/省略多个记录
让我们假设我有一个文件a,其中包含以下数据:使用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
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后无法更改它们。如果小文件未排序并且在内存中排序,您仍然可以使用上面的代码按顺序处理表。进行二进制搜索将是不必要的开销。非常感谢比尔·伍德格。我将尝试代码并向您发送消息。