【问题标题】:Remove multiple header from ps file从 ps 文件中删除多个标题
【发布时间】:2017-02-09 09:37:38
【问题描述】:

我有一个 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 ,我们可以这样做吗?

【问题讨论】:

  • 输入数据是多个输入文件合并在一起的吗?
  • 不,它是一个文件!
  • 是的,可以做到。你的数据集的 RECFM 和 LRECL 是什么?
  • 如果你要放弃它,为什么不让程序不写出标题?
  • 注意@SaggingRufus 的观点。这对于一次性清理是有意义的,但不应该是一个正常的过程。通常,如果数据不应该存在,则原始程序不应该创建它。

标签: mainframe dfsort


【解决方案1】:

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

您将 JOINKEYS 与您的数据集名称一起用于两个输入文件。

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

您在文件上创建序列号的 JOINKEYS 键。

使用 JOIN UNPAIRED,F2(这将使您匹配,而在 F2 上不匹配)。

F1:1,3:F2:1,80 的重构

OMIT with COND= 用于主要任务,您可以删除 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

关于改革:

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 可能存在的地方与 Main Task 进行互操作。

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

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

JOIN UNPAIRED,F2会获取所有匹配的记录,以及所有不匹配的F2(只有一条,最后一条记录,因为匹配在序号上,偏移1)。

要了解这一点(或进一步的任何 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 表示两个文件,2 表示仅在 F​​2 上(没有显示 1,因为 JOIN 语句只要求匹配和不匹配 F2)。

【讨论】:

    猜你喜欢
    • 2013-08-06
    • 2013-05-13
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多