Syncsort - 将 UNPAIRED 记录写入 SORTOUT 文件,将 PAIRED 记录写入 PAIRED 文件

Posted

技术标签:

【中文标题】Syncsort - 将 UNPAIRED 记录写入 SORTOUT 文件,将 PAIRED 记录写入 PAIRED 文件【英文标题】:Syncsort - Write UNPAIRED records to SORTOUT file, and PAIRED records to PAIRED file 【发布时间】:2018-11-22 18:56:47 【问题描述】:

我可以使用以下命令将未配对的记录保存到 SORTOUT(这是我想要的):

//SORT     EXEC PGM=SORT,PARM='DYNALLOC=(SYSDA,255)'
//SORTMSGS DD SYSOUT=*
//SORTJNF1 DD DSN=FILE1,
//            DISP=OLD,DCB=BUFNO=255
//SORTJNF2 DD DSN=FILE2,
//            DISP=OLD,DCB=BUFNO=255
//SORTOUT  DD DSN=FILEOUT,
//            DISP=(NEW,CATLG,DELETE),
//            UNIT=(SYSDA,59),
//            SPACE=(CYL,(500,100),RLSE)
//SYSIN    DD *
SORT FIELDS=COPY
JOINKEYS FILE=F1,FIELDS=(25,4,A,115,20,A,135,4,A,140,4,A,5,20,A)
JOINKEYS FILE=F2,FIELDS=(5,4,A,9,20,A,29,4,A,33,4,A,37,20,A)
JOIN UNPAIRED,F2,ONLY

但我需要将 PAIRED 记录保存到单独的文件中。我尝试了以下语句,但 PAIRED 记录没有保存在我的 PAIRED 文件中:

//SORT     EXEC PGM=SORT,PARM='DYNALLOC=(SYSDA,255)'
//SORTMSGS DD SYSOUT=*
//SORTJNF1 DD DSN=FILE.F1,
//            DISP=OLD,DCB=BUFNO=255
//SORTJNF2 DD DSN=FILE.F2,
//            DISP=OLD,DCB=BUFNO=255
//SORTOUT  DD DSN=FILE.SORTOUT,
//            DISP=(NEW,CATLG,DELETE),
//            UNIT=(SYSDA,59),
//            SPACE=(CYL,(500,100),RLSE)
//PAIRED   DD DSN=FILE.PAIRED,
//            DISP=(NEW,CATLG,DELETE),
//            UNIT=(SYSDA,59),
//            SPACE=(CYL,(500,100),RLSE)
//SYSIN    DD *
SORT FIELDS=COPY
JOINKEYS FILE=F1,FIELDS=(25,4,A,115,20,A,135,4,A,140,4,A,5,20,A)
JOINKEYS FILE=F2,FIELDS=(5,4,A,9,20,A,29,4,A,33,4,A,37,20,A)
JOIN UNPAIRED,F2,ONLY
OUTFIL FNAMES=SORTOUT
OUTFIL FNAMES=PAIRED,SAVE

【问题讨论】:

【参考方案1】:

编辑 1: OP 已经提到(在这个答案的 cmets 部分),“我只想在我的主 SORTOUT 数据集中保留未配对记录(仅限 F2),并且配对记录(仅限 F2)在我的 PAIRED 数据集中。”配对记录意味着 F1 和 F2。 OP 基本上是在寻找 RIGHT JOIN。下面提供的 SORT 语句根据 OP 的要求进行编辑。请注意,除非指定了带有ONLY 操作数的JOIN 语句,否则需要REFORMAT 语句。

您必须使用 Syncsort 中的方法(在 dfsort 中称为 indicator 方法),才能达到您的预期。请参阅下面的 SORT 语句。

SORT FIELDS=COPY
JOINKEYS FILE=F1,FIELDS=(25,4,A,115,20,A,135,4,A,140,4,A,5,20,A)
JOINKEYS FILE=F2,FIELDS=(5,4,A,9,20,A,29,4,A,33,4,A,37,20,A)
REFORMAT FIELDS=(F1:p,l,F2:p,l,?)
JOIN UNPAIRED,F2
OUTFIL FNAMES=BOTH,INCLUDE=(53,1,CH,EQ,C'B'),BUILD=(Build the columns you need from F1/F2)                          
OUTFIL FNAMES=UNPAIRED,INCLUDE=(53,1,CH,EQ,C'2'),BUILD=(Build the columns you need from F2)

在哪里,

p - 位置值表示字段相对于输入记录开头的第一个字节。

l - 长度值表示字段的长度。

注意REFORMAT FIELDS 语句中的?

引自 Syncsort for z/OS 程序员指南:

?

此符号用于在重新格式化后放置一个单字节指示符 指示重新格式化的记录是成对还是成对的记录 未配对的加入记录。该指标将设置为三个之一 不同的可打印值:

“B”如果重新格式化的记录是成对的 记录

如果重新格式化的记录是创建的未配对记录,则为“1” 来自 F1 文件

如果重新格式化的记录是未配对的记录,则为“2” 从 F2 文件创建

更多细节:

Paired and unpaired F1/F2 records (indicator method)。 Syncsort for z/OS Programmer's guide。

希望这会有所帮助!

【讨论】:

谢谢。我不需要/不想重新格式化/包含特定记录。我只想在我的主 SORTOUT 数据集中保留未配对记录(仅限 F2),并在我的配对数据集中保留配对记录(仅限 F2)。 好的!基本上你正在寻找一个正确的加入。 JOIN UNPAIRED,F2,ONLY 正如您在 SORT 语句中编码的那样,将获取在 F1 中与指定键不匹配的 F2 记录。考虑编码JOIN UNPAIRED,F2,它将从 F1 和 F2 获取匹配记录 + 从 F2 获取不匹配记录。除非指定了带有 ONLY 操作数的 JOIN 语句,否则需要 REFORMAT 语句。

以上是关于Syncsort - 将 UNPAIRED 记录写入 SORTOUT 文件,将 PAIRED 记录写入 PAIRED 文件的主要内容,如果未能解决你的问题,请参考以下文章

z/OS Syncsort:省略不排序的重复项

syncsort 将 pd 精确转换为 zdf

Syncsort Sum Fields=None 不删除重复项

CycleGAN-Unpaired图像翻译

Contrastive Learning for Unpaired Image-to-Image Translation(CUT)阅读笔记

下一条记录的测试数据