0

我有 2 个旧(F1)和新(F2)工作文件,它们的长度相同。我应该逐条比较文件记录,对于新(F2)工作文件中的任何新记录,我应该在开始的3个位置在它前面插入“ADD”,其余记录(匹配)应该是空格.

到目前为止,我可以使用以下代码复制 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”字符串,这可以一步完成吗?

4

1 回答 1

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

UNPARED,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 上),而它们加在一起只是一个更改。

于 2014-11-11T11:01:06.767 回答