0

我有一些数据如下:

这不是实际数据,但实际数据与此类似。而且,数据来自一个文件,每个字段之间有 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 来实现这一点......?

4

3 回答 3

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=*
//*
于 2013-08-23T18:14:10.057 回答
1

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

首先,使用 SyncTool(很可能“别名”为 ICETOOL,这样您就可以在某处使用 EXEC PGM=ICETOOL)。查看具有 LAST 的 SELECT 运算符,它应该可以满足您的需求。如果您的文件已经排序,请不要再次排序(使用文件中的选项复制)。

可以在本出版物的“保留删除的重复记录 (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 将不一致的重复项保存在单独的数据集中,您可以在记录的临时扩展中包含一个序列号,并在主键之后对其进行排序,降序。删除临时扩展。这不能一步完成,但 SELECT(当然是 DFSORT 版本)可以在一个函数中完成 XSUM 所做的所有事情,甚至更多。

最后,在我的脑海中挥之不去之后,如果您当前的 SyncSort 至少为 1.4,您可以使用 DUPKEYS 和 LASTDUP 完全按照您的意愿(但我们仍然不知道那是什么)和XDUP 而不是 SUM 和 XSUM。

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

  DUPKEYS LASTDUP,NODUPS,XDUP
于 2013-08-24T12:19:10.963 回答
1

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

如果您有最新版本的 SyncSort,则将 DUPKEYS 与 LASTDUP 和 EQUALS 一起使用,如其他答案中所述。

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

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

所以,如果 SyncSort 支持你想要的命令,那么一定要使用它!如果不是,那么退出相对容易编码......

于 2013-08-27T07:55:57.350 回答