首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SYNCSORT中使用XSUM时需要最后一个条目

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

Stack Overflow用户
提问于 2013-08-23 10:10:21
回答 3查看 8.7K关注 0票数 0

我有如下数据:

这不是实际数据,但实际数据与此类似。而且,数据以一个文件的形式出现,每个字段之间有两个空格。输入或输出不涉及数据库。我使用表格格式只是为了让它可以理解。

代码语言:javascript
运行
复制
 Name    Number   code
+---------------------+
 Albert  122234   xcc
 Robert  565435   rtd
 Robert  776567   iuy
 Robert  452890   yyt
 Stuart  776565   ter

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

代码语言:javascript
运行
复制
Albert  122234  xcc
Robert  565435  rtd
Robert  776567  iuy
Robert  452890  yyt
Stuart  776565  ter

现在,我需要使用SYNCSORT消除重复。我可以使用XSUM完成这一任务,但我将获得以下数据:

代码语言:javascript
运行
复制
 Name    Number   code
+---------------------+
 Albert  122234   xcc
 Robert  565435   rtd
 Stuart  776565   ter

但我需要:

代码语言:javascript
运行
复制
 Name     Number   code
+----------------------+
 Albert   122234   xcc
 Robert   452890   yyt
 Stuart   776565   ter

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

那么,有什么方法可以用XSUM.来实现这一点吗?

EN

回答 3

Stack Overflow用户

发布于 2013-08-23 18:14:10

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

第二步仅按名称与EQUALS参数进行排序,在排序字段中出现重复值的情况下,将数据保持在与输入文件相同的顺序。然后用SUM FIELDS=NONE消除重复项。

代码语言:javascript
运行
复制
//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=*
//*
票数 3
EN

Stack Overflow用户

发布于 2013-08-24 12:19:10

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

首先,使用SyncTool (很可能将其“别名”为ICETOOL,这样您就有了PGM=ICETOOL )。看看SELECT操作符,它有LAST,它应该给您想要的东西。如果您的文件已经排序,不要再对其排序(在使用文件中选择复制)。

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

您最终将得到一张控制卡,如下所示:

代码语言:javascript
运行
复制
  SELECT FROM(IN) TO(OUT) ON(1,3,CH) FIRST DISCARD(SORTXSUM)

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

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

最后,您将按照以下方式获得控制卡:

代码语言:javascript
运行
复制
  OPTION EQUALS                                         
  SORT FIELDS=(1,3,CH,A)                                 
  OUTFIL REMOVECC,NODETAIL,SECTIONS=(1,3,TRAILER3=(1,80))

如果要对数据进行排序,并希望使用XSUM在单独的dataset中保留离散副本,则可以在记录和排序的临时扩展中包含一个序列号,并在主键之后降序。放下临时分机。这不可能在一步之内完成,但是SELECT (当然是DFSORT版本)可以完成XSUM所做的所有事情,并且可以在一个函数中完成更多的操作。

最后,在我脑海中烦扰了一些事情之后,如果您当前的SyncSort至少为1.4,那么您完全可以使用DUPKEYS使用LASTDUP和XDUP,而不是SUM和XSUM来实现您想做的事情(但我们仍然不知道这是什么)。

您最终将得到一张控制卡,如下所示:

代码语言:javascript
运行
复制
  DUPKEYS LASTDUP,NODUPS,XDUP
票数 1
EN

Stack Overflow用户

发布于 2013-08-27 07:55:57

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

如果您最近发布了一个SyncSort,那么在LASTDUP中使用DUPKEYS,并且等于其他答案中提到的那样。

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

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

因此,如果SyncSort支持一个命令来满足您的需要,那么一定要使用它!如果没有,那么出口相对容易编码..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18400186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档