将文件与DFSORT进行比较,插入一个字符串' ADD'在新记录面前

时间:2014-11-10 12:22:03

标签: mainframe dfsort

我有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'在新记录前面的字符串,这可以一步完成吗?

1 个答案:

答案 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上),而那些合在一起只是一个变化。