我有一个正在读取文件的程序(FILE1)。对于FILE1中的每个记录,它都会获得字段' A'并且它通过FILE2搜索以找到具有匹配值field' B'的记录。当A = B时,读出两个文件中的一些字段。该程序目前正在使用如下代码。但是,问题是我在一个循环中多次打开和关闭FILE2。我在没有打开循环内的文件的情况下尝试了这个但是如果我这样做,我会重复记录,因为正在从上一次搜索停止的地方读入FILE2。每当我从FILE1读取新记录时,有什么方法可以指向File2的开头?代码如下:
READ FILE(FILE1) INTO (IN_LAYOUT);
DO WHILE (MORE_RECS1);
OPEN FILE(FILE2);
READ FILE(FILE2) INTO (IN_LAYOUT2);
MORE_RECS2 = '1'B;
DO WHILE (MORE_RECS2);
IF (A = B) THEN
DO;
VAL = VAL2;
WRITE FILE (OUFILE) FROM (OUT_LAYOUT);
S_MORE_RECS2 = '0'B;
CLOSE FILE(FILE2);
END; /* ENDIF */
ELSE READ FILE(FILE2) INTO (IN_LAYOUT2);
END; /* INNER DOWHILE */
READ FILE(FILE1) INTO (IN_LAYOUT);
END;
答案 0 :(得分:2)
这看起来像匹配合并。首先尝试按照您匹配的键对文件进行排序。
至少有一些大型机排序实用程序内置了此匹配合并功能,例如Syncsort具有JOIN运算符。我确定DFSORT也具备此功能。
答案 1 :(得分:1)
在这种情况下,@cschneid答案是最好的解决方案。为了完整性,还有其他解决方案:
如果您对键上的2个输入文件进行排序,则可以执行以下操作:
DO WHILE (MORE_RECS1 and MORE_RECS2);
if (key_file1 < key_file2) then do;
READ FILE(FILE1) INTO (IN_LAYOUT);
end; else if (key_file1 > key_file2) then do;
READ FILE(FILE2) INTO (IN_LAYOUT2);
end; else do;
VAL = VAL2;
WRITE FILE (OUFILE) FROM (OUT_LAYOUT);
READ FILE(FILE1) INTO (IN_LAYOUT);
end;
end;
当逻辑要复杂排序时使用它是有意义的(例如你 需要DB查找
另一种方法是将File2加载到VSAM文件中并执行键控读取。 这有助于避免多次进行昂贵的数据库查找 (特别是对于不如DB2灵活的IMS)。
在大多数情况下,上面的Sort-Merge处理将比VSAM查找更快。