在SYNCSORT JCL中使用XSUM时需要最后一个条目

时间:2013-08-23 10:10:21

标签: mainframe syncsort

我有一些如下数据:

这不是实际数据,但实际数据与此类似。并且,数据存在于每个字段之间有2个空格的文件中。输入或输出中不涉及数据库。我使用表格格式只是为了让它变得可以理解。

 Name    Number   code
+---------------------+
 Albert  122234   xcc
 Robert  565435   rtd
 Robert  776567   iuy
 Robert  452890   yyt
 Stuart  776565   ter

在文件中,数据看起来像......

Albert  122234  xcc
Robert  565435  rtd
Robert  776567  iuy
Robert  452890  yyt
Stuart  776565  ter

现在,我需要使用SYNCSORT消除重复项。我可以使用XSUM来做到这一点,但我会得到以下数据:

 Name    Number   code
+---------------------+
 Albert  122234   xcc
 Robert  565435   rtd
 Stuart  776565   ter

但我需要:

 Name     Number   code
+----------------------+
 Albert   122234   xcc
 Robert   452890   yyt
 Stuart   776565   ter

最后一组数据在输出中最后一次出现Robert,而前一组数据首次出现。

那么,有没有办法用XSUM来实现这个目的......?

3 个答案:

答案 0 :(得分:3)

两个步骤,第一步添加一个序列号,并按名称升序和序列号降序排序。这是为了获得每个名字的最后一条记录。

第二步使用EQUALS参数按名称排序,该参数表示在SORT字段中重复值的情况下,数据与输入文件保持相同的顺序。然后我们使用SUM FIELDS = NONE来消除重复。

//SORT1    EXEC PGM=SORT
//SORTIN   DD  *
ALBERT  122234  XCC
ROBERT  565435  RTD
ROBERT  776567  IUY
ROBERT  452890  YYT
STUART  776565  TER
//SYSIN    DD  *
 INREC FIELDS=(001:001,020,         * REGULAR INPUT DATA
               021:SEQNUM,4,BI)     * ADD A SEQUENCE NUMBER
 SORT  FIELDS=(001,008,CH,A,
               021,004,BI,D)
 OUTREC FIELDS=(001:001,020,        * ORIGINAL INPUT DATA
                080:C' ')           * PADDING
//SORTOUT  DD  DISP=(NEW,PASS),
//             AVGREC=U,
//             LRECL=80,
//             RECFM=FB,
//             SPACE=(80,(1000,100))
//SYSOUT   DD  SYSOUT=*
//*
//SORT2    EXEC PGM=SORT
//SORTIN   DD  DISP=(SHR,PASS),DSN=*.SORT1.SORTOUT
//SYSIN    DD  *
 SORT  FIELDS=(001,008,CH,A),EQUALS
 SUM FIELDS=NONE
//SORTOUT  DD  SYSOUT=*
//SYSOUT   DD  SYSOUT=*
//*

答案 1 :(得分:1)

有多种方法可以做到这一点。

首先,使用SyncTool(很可能是“别名”到ICETOOL,这样你就可以在某处继续使用EXEC PGM = ICETOOL)。查看具有LAST的SELECT运算符,它可以为您提供所需的内容。如果您的文件已经排序,请不要再次排序(USING文件中的OPTION COPY)。

可以在本出版物的“保留删除的重复记录(XSUM)”下找到一个示例:ftp://ftp.software.ibm.com/storage/dfsort/mvs/sorttrck.pdf

你最终会得到一张控制卡:

  SELECT FROM(IN) TO(OUT) ON(1,3,CH) FIRST DISCARD(SORTXSUM)

这里也是一个简单的例子:http://www.ibmmainframes.com/viewtopic.php?p=310008#310008

如果您的数据已经排序,或者已经排序,请使用OUTFIL和“报告功能”。查看REMOVECC和NODETAIL,使用SECTIONS和TRAILER3。在这里,http://www.ibmmainframes.com/viewtopic.php?p=309955#309955就是一个例子。

您将最终获得控制卡:

  OPTION EQUALS                                         
  SORT FIELDS=(1,3,CH,A)                                 
  OUTFIL REMOVECC,NODETAIL,SECTIONS=(1,3,TRAILER3=(1,80))

如果要对数据进行排序并希望使用XSUM将不相关的副本保存在单独的数据集中,则可以在记录的临时扩展中包含序列号,并在主键后面的SORT上包含Descending。删除临时扩展名。这不能一步完成,但SELECT(当然是DFSORT版本)可以在一个函数中完成XSUM所做的所有工作。

最后,在我的脑海中唠叨之后,如果你有一个至少1.4的当前SyncSort,你可以完全按照自己的意愿行事(条件是我们仍然不用DUPKEYS和LASTDUP和XDUP而不是SUM和XSUM知道那是什么。

你最终会得到一张控制卡:

  DUPKEYS LASTDUP,NODUPS,XDUP

答案 2 :(得分:1)

看起来您希望保留一组具有相同排序键的记录的最后记录。

如果您最近发布了SyncSort,那么请使用DUPKEYS和LASTDUP,以及其他答案中提到的EQUALS。

我已经使用了SyncSort已经有一段时间了,但是如果我没记错的话,可以编写一个可以访问sortkeys并可以接受或拒绝记录的退出例程。为每条记录输入退出例程,因此可以保留先前的排序键以进行比较。

另外,我喜欢在汇编程序(BAL)中编写出口,但这可以用COBOL代码完成。

所以,如果SyncSort支持的命令可以满足您的需求,那么请务必使用它!如果没有,则退出相对容易编码...