我有2个工作文件旧(F1)和新工作文件(F2),两者长度相同。我应该逐个记录文件和新(F2)工作文件中的任何新记录,我应该插入' ADD'在它前面开始3个位置和其余的记录(匹配)它应该是空格。
截至目前,我可以使用以下代码复制F2中但不在F1中的记录:
//SYSIN DD *
JOINKEYS FILE=F1,FIELDS=(1,79,A)
JOINKEYS FILE=F2,FIELDS=(1,79,A)
JOIN UNPAIRED,F2,ONLY
SORT FIELDS=COPY
/*
但是我需要来自F2的所有记录' NEW'在新记录前面的字符串,这可以一步完成吗?
答案 0 :(得分:0)
此似乎是您想要的。我不相信你很快会想要它。
每个文件的所有记录都将根据我假设的整个长度进行排序。这意味着对于第一次运行,您的输出将与输入的顺序不同。
如果可以进行更改,“更改”将与NEW完全相同。
如果你对这两者都没问题,你应该在你的问题中说出来。
//SYSIN DD *
JOINKEYS FILE=F1,FIELDS=(1,79,A)
JOINKEYS FILE=F2,FIELDS=(1,79,A)
JOIN UNPAIRED,F2
REFORMAT FIELDS=(?,F2:1,2,1,79)
INREC IFTHEN=(WHEN=(1,1,CH,EQ,C'2'),
OVERLAY=(1:C'NEW')),
IFTHEN=(WHEN=(NONE,
OVERLAY=(1:3X))
SORT FIELDS=COPY
未完成,F2将为您提供所有比赛,以及来自F2(您的新输入)不匹配的比赛。
REFORMAT语句将连接匹配标记(?)放在第一个位置,然后放入任意两个字节,然后放入整个数据。 REFORMAT记录将是82个字节。
在INREC中,测试来自匹配标记的字段,以便在需要时可以在记录的开头覆盖NEW。否则,将覆盖三个空白。
有一种更清晰的方式来表达相同的输出:
//SYSIN DD *
JOINKEYS FILE=F1,FIELDS=(1,79,A)
JOINKEYS FILE=F2,FIELDS=(1,79,A)
JOIN UNPAIRED,F2
REFORMAT FIELDS=(?,F2:1,79)
INREC IFTHEN=(WHEN=(1,1,CH,EQ,C'2'),
BUILD=(C'NEW',2,79)),
IFTHEN=(WHEN=(NONE,
BUILD=(3X,2,79)),
SORT FIELDS=COPY
这次使用BUILD,而不是OVERLAY。
通过更好(任何?)的数据知识,可以提供更好的解决方案。
即使在其他网站上提供但未在此处提供的信息,也不够。
//SYSIN DD *
JOINKEYS FILE=F1,FIELDS=(1,79,A)
JOINKEYS FILE=F2,FIELDS=(1,79,A)
JOIN UNPAIRED,F2,ONLY
SORT FIELDS=COPY
/*
我们可以猜测你的文件是79,FB,但它不一定是。
要获得不匹配并在现有代码的前面放置NEW,这很容易:
//SYSIN DD *
JOINKEYS FILE=F1,FIELDS=(1,79,A)
JOINKEYS FILE=F2,FIELDS=(1,79,A)
JOIN UNPAIRED,F2,ONLY
INREC BUILD=(C'NEW',1,79)
SORT FIELDS=COPY
您的输出当然是每条记录82个字节。
但是,这假设您在79字节密钥上没有重复,并且您的整个记录都是79字节。
它还假设您不关心输出文件的顺序。
每个JOINKEYS都在对其文件进行分类,然后将数据呈现给匹配的进程。
请记住,通过更改和这种验证方法(对整个记录进行排序,比较整个记录),您会发现很难不为逻辑上相同的记录输出两个记录。一个看起来像一个删除(来自F1),另一个看起来像一个新的(在F2上),而那些合在一起只是一个变化。