我有一些如下数据:
这不是实际数据,但实际数据与此类似。并且,数据存在于每个字段之间有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来实现这个目的......?
答案 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支持的命令可以满足您的需求,那么请务必使用它!如果没有,则退出相对容易编码...