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 文件的主要内容,如果未能解决你的问题,请参考以下文章
Syncsort Sum Fields=None 不删除重复项
Contrastive Learning for Unpaired Image-to-Image Translation(CUT)阅读笔记