从ps文件中删除多个标头

时间:2017-02-09 09:37:38

标签: mainframe dfsort

我有一个ps文件,如果下面没有数据,我想删除标题,即。如果在两个连续的行中有标题(由FIRST 3字母HDR识别),我想删除第一个,因为没有数据。

输入数据

HDR20170123
HDR20170124
1.8988 ABCD
1.4324 PARE
HDR20170125
1.5432 URST

期望输出

HDR20170124
1.8988 ABCD
1.4324 PARE
HDR20170125
1.5432 URST

无论如何使用dfsort,我们可以这样做吗?

1 个答案:

答案 0 :(得分:2)

有两种技术,JOINKEYS技术在很短的时间内更容易解释。

您使用JOINKEYS,两个输入文件的数据集名称。

您可以为两个输入定义JNFnCNTL数据集,并在每个输入中为每个记录附加序列号。一个(JNFCNTL1)序列号从零开始,另一个(JNFCNTL2)从一个开始。序列号必须足够大才能表达您的记录数。

JOINKEYS键可以在文件上创建序列号。

使用JOIN UNPAIRED,F2(可以获得匹配,在F2上无法匹配)。

F1重组:1,3:F2:1,80

OMIT with COND = for main task,在那里你摆脱了记录,其中1,3是HDR,1,3匹配4,3(前一个记录是标题)。

然后在主任务中使用BUILD =(4,80)来摆脱前一条记录中的前三个字节。

在输入上,您的数据将如下所示,偏移量代表序列号:

     F1          F2
HDR20170123 
HDR20170124 HDR20170123
1.8988 ABCD HDR20170124
1.4324 PARE 1.8988 ABCD
HDR20170125 1.4324 PARE
1.5432 URST HDR20170125
            1.5432 URST

在REFORMAT上:

HDR 
HDRHDR20170123
1.8HDR20170124
1.41.8988 ABCD
HDR1.4324 PARE
1.5HDR20170125
   1.5432 URST

当您拥有当前记录时,您所获得的数据是来自前一记录的数据的可用性(前三个字节,对于给定的案例,您需要的数量),因此对先前记录的测试值很容易

现在有些代码的时间:

//SYSIN    DD * 
  OPTION COPY 
  JOINKEYS F1=INA,FIELDS=(81,6,A),SORTED,NOSEQCK
  JOINKEYS F2=INB,FIELDS=(81,6,A),SORTED,NOSEQCK
  JOIN UNPAIRED,F2 
  REFORMAT FIELDS=(F1:1,3, 
                  F2:1,80) 
  OMIT COND=(1,3,CH,EQ,C'HDR', 
            AND, 
             1,3,CH,EQ,4,3,CH) 
  INREC BUILD=(4,80) 
//JNF1CNTL DD * 
  INREC  OVERLAY=(81:SEQNUM,6,ZD, 
                     START=0) 
//JNF2CNTL DD * 
  INREC  OVERLAY=(81:SEQNUM,6,ZD, 
                     START=1) 
//INA      DD * 
HDR20170123 
HDR20170124 
1.8988 ABCD 
1.4324 PARE 
HDR20170125 
1.5432 URST 
//INB      DD * 
HDR20170123 
HDR20170124 
1.8988 ABCD 
1.4324 PARE 
HDR20170125 
1.5432 URST 

产生您想要的输出:

HDR20170124
1.8988 ABCD
1.4324 PARE
HDR20170125
1.5432 URST

JOINKEYS操作将包含三个"任务"同时运作。 "主要任务"是一个完全正常的SORT步骤,包括你想要的任何东西。

有两个子任务,每个子任务对应一个输入数据集。这些子任务中的每一个都可以具有提供的其他控制卡以修改其数据。这些是在JNFnCNTL DD上指定的。 JNF1CNTL和JNF2CNTL。根据实际要求,您可以不提供任何一个或两个。在这里你想要两个。

JNFnCNTL数据集必须只包含普通控制卡的子集。它们可能不包含OUTREC或OUTFIL。这是因为它们与主要任务完全在OUTREC可能存在的地方进行互操作。

在JOINKEYS语句中,指定SORTED,NOSEQCK。这是因为,默认情况下,JOINKEYS数据集被排序(在匹配的键上),并且序列已经得到保证(并且不需要检查),因为键的序列是序列号。

REFORMAT语句应仅包含主任务中所需的数据。这里所需要的只是HDR可能存在的位置,以及来自F2的完整记录。

JOIN UNPAIRED,F2将获得所有匹配的记录,以及所有不匹配的F2(最终记录只有一个,因为匹配在序列号上,偏移一个)。

要理解这一点(或任何进一步的DSFORT数据操作)进行修改以在中间阶段显示数据。这里只有一个阶段,所以很简单:

//SYSIN    DD * 
  OPTION COPY 
  JOINKEYS F1=INA,FIELDS=(81,6,A),SORTED,NOSEQCK
  JOINKEYS F2=INB,FIELDS=(81,6,A),SORTED,NOSEQCK
  JOIN UNPAIRED,F2 
  REFORMAT FIELDS=(F1:1,12,81,6,12,1, 
                   F2:1,12,81,6,12,1, 
                   ?) 
//JNF1CNTL DD * 
  INREC  OVERLAY=(81:SEQNUM,6,ZD, 
                     START=0) 
//JNF2CNTL DD * 
  INREC  OVERLAY=(81:SEQNUM,6,ZD, 
                     START=1) 
//INA      DD * 
HDR20170123 
HDR20170124 
1.8988 ABCD 
1.4324 PARE 
HDR20170125 
1.5432 URST 
//INB      DD * 
HDR20170123 
HDR20170124 
1.8988 ABCD 
1.4324 PARE 
HDR20170125 
1.5432 URST 

生成此输出:

HDR20170124 000001 HDR20170123 000001 B
1.8988 ABCD 000002 HDR20170124 000002 B
1.4324 PARE 000003 1.8988 ABCD 000003 B
HDR20170125 000004 1.4324 PARE 000004 B
1.5432 URST 000005 HDR20170125 000005 B
                   1.5432 URST 000006 2

由于您只在80字节数据中显示11个字节的数据,因此在此REFORMAT语句中,前12个位置被采用(第12个位置留空),12,1也用作分隔符(文字不能是用于REFORMAT)。还显示了相应的序列号,内置匹配标记(REFORMAT中的?(问号):两个文件中的B,仅适用于F2上的2(显示为1,因为JOIN语句仅询问匹配和无与伦比的F2)。