我需要比较两个文件,然后匹配记录一个文件,然后使用jcl中的joinkeys将其不匹配到另一个文件中。我不确定这是否正确。请你帮助我好吗? 第一个具有唯一18个记录长度的输入文件,它将与input2的前18个长度进行比较。如果匹配,那么我们将根据buid条件将记录写入输出文件中;如果不匹配,则将记录复制到另一个文件中
SORT FIELDS=COPY
JOINKEYS FILE=F1,FIELDS=(1,18,A)
JOINKEYS FILE=F2,FIELDS=(1,18,A)
REFORMAT FIELDS=(F2:1,258,F2:264,1,F2:334,2)
OUTFIL FNAMES=MATCH
SORT FIELDS=COPY
JOINKEYS FILE=F1,FIELDS=(1,18,A)
JOINKEYS FILE=F2,FIELDS=(1,18,A)
JOIN UNPAIRED,F2,ONLY
REFORMAT FIELDS=(F2:1,258,F2:264,1,F2:334,2)
OUTFIL FNAMES=UNMATCH
答案 0 :(得分:1)
欢迎堆栈溢出!您必须在dfsort中使用 indicator方法才能达到期望的效果。请参见下面的SORT语句。
JOINKEYS FILE=F1,FIELDS=(1,18,A)
JOINKEYS FILE=F2,FIELDS=(1,18,A)
REFORMAT FIELDS=(F2:1,258,F2:264,1,F2:334,2,?)
OUTFIL FNAMES=BOTH,INCLUDE=(262,1,CH,EQ,C'B'),BUILD=(1,261)
OUTFIL FNAMES=F1ONLY,INCLUDE=(262,1,CH,EQ,C'1'),BUILD=(1,258)
OUTFIL FNAMES=F2ONLY,INCLUDE=(262,1,CH,EQ,C'2'),BUILD=(259,3)
?
中的REFORMAT FIELD
负责填充指标在第262个位置。如果密钥在两个文件中都匹配,则第262位将具有B
,表示两者。如果密钥不匹配,则第262位将通知您1
或2
记录来自哪个文件。
注意:
您可以更改BUILD
语句以编写您要使用的列
如果密钥不匹配,则要求。确保您有那些列
在REFORMAT FIELDS
中被提及。
确保在JCL中具有DD名称BOTH
,F1ONLY
和F2ONLY
。
更多详细信息here
答案 1 :(得分:1)
我尝试了以下示例。一切正常。输入和输出文件的记录长度为80。记录格式(RECFM)为FB。
//SYSIN DD *
JOINKEYS FILE=F1,FIELDS=(1,10,A),SORTED
JOINKEYS FILE=F2,FIELDS=(1,10,A),SORTED
JOIN UNPAIRED,F1,F2
REFORMAT FIELDS=(F1:1,10,F2:1,10,?)
OPTION COPY
OUTFIL FNAMES=F1ONLY,INCLUDE=(21,1,CH,EQ,C'1'),
BUILD=(1,10,70X)
OUTFIL FNAMES=F2ONLY,INCLUDE=(21,1,CH,EQ,C'2'),
BUILD=(11,10,70X)
OUTFIL FNAMES=BOTH,INCLUDE=(21,1,CH,EQ,C'B'),
BUILD=(1,10,70X)
/*
答案 2 :(得分:0)
您可以使用 1. JCL程序-JOIN KEYS的使用 2. COBOL程序-文件匹配逻辑(在下面的链接中对这两种逻辑进行了说明) 3. Easytrieve或REXX程序
https://www.youtube.com/watch?v=pQumm7ueYik&list=PLB4QPUJFZRcTsP1cKe2sSIObFMlvkyjnn&index=4