Cobol 需要看看我是否可以使用read语句来完成3种类型的输出吗?
我被要求编写程序来处理2个输入文件(客户和员工),匹配两个文件的键,并生成以下3个输出文件:Cobol 需要看看我是否可以使用read语句来完成3种类型的输出吗?,cobol,Cobol,我被要求编写程序来处理2个输入文件(客户和员工),匹配两个文件的键,并生成以下3个输出文件: 文件1:两个文件上的记录 文件2:记录在客户文件中,但不在员工文件中 文件3:记录在员工文件中,但不在客户文件中 设置“我的循环”是为了将客户文件中的一条记录与员工文件中的每条记录进行检查,然后从客户文件中获取另一个密钥对值,并重新开始该过程 目前: 匹配的记录-必须在文件1和文件2中(此功能) 在文件1中但不在文件2中的记录(不工作) 在文件2中但不在文件1中的记录(不工作) 问题:是否有一种方法
- 文件1:两个文件上的记录
- 文件2:记录在客户文件中,但不在员工文件中
- 文件3:记录在员工文件中,但不在客户文件中
我认为不可能用当前代码完成所有三项任务。如果文件包含1000000条记录,会发生什么情况。您将读取一个文件1000000次。这将需要永远才能完成(假设硬盘幸存下来)
对于这种类型的处理,我建议使用排序合并过程:
- 将文件排序为键序列
- 对2个文件执行合并(对于3个文件,过程类似,只需执行更复杂的评估)
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