我有两个输入文件,每个文件的长度为 5200 字节。一个七字节的密钥用于比较两个文件,如果有匹配项,则需要将其写入“匹配”文件,但在写入匹配文件时,我需要infile1
来自infile2
.
如果没有匹配,则写入no match
文件。
有可能做到sort
吗?我知道使用 COBOL 程序可以轻松完成,但只想知道SORT/ICETOOL/Easytrieve Plus (EZTPA00)
.
我有两个输入文件,每个文件的长度为 5200 字节。一个七字节的密钥用于比较两个文件,如果有匹配项,则需要将其写入“匹配”文件,但在写入匹配文件时,我需要infile1
来自infile2
.
如果没有匹配,则写入no match
文件。
有可能做到sort
吗?我知道使用 COBOL 程序可以轻松完成,但只想知道SORT/ICETOOL/Easytrieve Plus (EZTPA00)
.
由于有 12,200 人查看了这个问题,但没有得到答案:
DFSORT 和 SyncSort 是主要的大型机排序产品。它们的控制卡有很多相似之处,也有一些不同之处。
JOINKEYS FILE=F1,FIELDS=(key1startpos,7,A)
JOINKEYS FILE=F2,FIELDS=(key2startpos,7,A)
JOIN UNPAIRED,F1,F2
REFORMAT FIELDS=(F1:1,5200,F2:1,5200)
SORT FIELDS=COPY
一个“JOINKEYS”由三个任务组成。子任务 1 是第一个 JOINKEYS。子任务 2 是第二个 JOINKEYS。主要任务紧随其后,是处理连接数据的地方。在上面的示例中,它是一个简单的 COPY 操作。连接的数据将被简单地写入 SORTOUT。
JOIN 语句定义了与匹配的记录一样,未配对的 F1 和 F2 记录将呈现给主任务。
REFORMAT 语句定义将呈现给主任务的记录。假设 F2 需要三个字段,一个更有效的示例是:
REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100)
F2 上的每个字段都定义有起始位置和长度。
然后由 Main 任务处理的记录长 5311 字节,F2 中的字段可以被 5201,10,5211,1,5212,100 引用,F1 记录为 1,5200。
实现相同目的的更好方法是使用 JNF2CNTL 减小 F2 的大小。
//JNF2CNTL DD *
INREC BUILD=(207,1,10,30,1,5100,100)
SyncSort 的某些安装不支持 JNF2CNTL,即使支持(从 Syncsort MFX for z/OS 版本 1.4.1.0 起),SyncSort 也没有记录。对于 1.3.2 或 1.4.0 的用户,可从 SyncSort 获得更新以提供 JNFnCNTL 支持。
应该注意的是,JOINKEYS 默认对数据进行排序,带有选项 EQUALS。如果 JOINKEYS 文件的数据已经按顺序排列,则应指定 SORTED。如果不需要序列检查,也可以指定 DFSORT NOSEQCHK。
JOINKEYS FILE=F1,FIELDS=(key1startpos,7,A),SORTED,NOSEQCHK
虽然请求很奇怪,但由于无法确定源文件,所有不匹配的记录都将转到单独的输出文件。
使用 DFSORT,有一个匹配标记,用 ? 指定 在改革:
REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100,?)
这将 REFORMAT 记录的长度增加了一个字节。这 ?可以在 REFORMAT 记录的任何地方指定,不需要指定。这 ?由 DFSORT 解析为: B,来自两个文件的数据;1,来自F1的无与伦比的记录;2,来自F2的无与伦比的记录。
SyncSort 没有匹配标记。REFORMAT 记录中是否存在数据必须由值确定。在不能包含特定值的两个输入记录上选择一个字节(例如,在一个数字中,决定一个非数字值)。然后将该值指定为 REFORMAT 上的 FILL 字符。
REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100),FILL=C'$'
如果 F1 的位置 1 不能自然有“$”,而 F2 的位置 20 也不能,那么这两个位置可以用来确定匹配的结果。如有必要,可以测试整个记录,但会占用更多 CPU 时间。
明显的要求是将 F1 或 F2 中的所有不匹配记录写入一个文件。这将需要一个 REFORMAT 语句,其中包含两个完整的记录:
DFSORT,输出不匹配的记录:
REFORMAT FIELDS=(F1:1,5200,F2:1,5200,?)
OUTFIL FNAMES=NOMATCH,INCLUDE=(10401,1,SS,EQ,C'1,2'),
IFTHEN=(WHEN=(10401,1,CH,EQ,C'1'),
BUILD=(1,5200)),
IFTHEN=(WHEN=NONE,
BUILD=(5201,5200))
SyncSort,输出不匹配的记录:
REFORMAT FIELDS=(F1:1,5200,F2:1,5200),FILL=C'$'
OUTFIL FNAMES=NOMATCH,INCLUDE=(1,1,CH,EQ,C'$',
OR,5220,1,CH,EQ,C'$'),
IFTHEN=(WHEN=(1,1,CH,EQ,C'$'),
BUILD=(1,5200)),
IFTHEN=(WHEN=NONE,
BUILD=(5201,5200))
SyncSort 的编码也适用于 DFSORT。
写出匹配的记录很容易。
OUTFIL FNAMES=MATCH,SAVE
SAVE 确保所有不是由另一个 OUTFIL 写入的记录都将写入这里。
需要进行一些重新格式化,主要是从 F1 输出数据,但要从 F2 中选择一些字段。这适用于 DFSORT 或 SyncSort:
OUTFIL FNAMES=MATCH,SAVE,
BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929)
具有任意开始和长度的整个事情是:
DFSORT
JOINKEYS FILE=F1,FIELDS=(1,7,A)
JOINKEYS FILE=F2,FIELDS=(20,7,A)
JOIN UNPAIRED,F1,F2
REFORMAT FIELDS=(F1:1,5200,F2:1,5200,?)
SORT FIELDS=COPY
OUTFIL FNAMES=NOMATCH,INCLUDE=(10401,1,SS,EQ,C'1,2'),
IFTHEN=(WHEN=(10401,1,CH,EQ,C'1'),
BUILD=(1,5200)),
IFTHEN=(WHEN=NONE,
BUILD=(5201,5200))
OUTFIL FNAMES=MATCH,SAVE,
BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929)
同步排序
JOINKEYS FILE=F1,FIELDS=(1,7,A)
JOINKEYS FILE=F2,FIELDS=(20,7,A)
JOIN UNPAIRED,F1,F2
REFORMAT FIELDS=(F1:1,5200,F2:1,5200),FILL=C'$'
SORT FIELDS=COPY
OUTFIL FNAMES=NOMATCH,INCLUDE=(1,1,CH,EQ,C'$',
OR,5220,1,CH,EQ,C'$'),
IFTHEN=(WHEN=(1,1,CH,EQ,C'$'),
BUILD=(1,5200)),
IFTHEN=(WHEN=NONE,
BUILD=(5201,5200))
OUTFIL FNAMES=MATCH,SAVE,
BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929)
大约 2 年前我使用过 JCL,所以无法为您编写代码,但这是我的想法;
我再次为没有代码的解决方案道歉,但我已经 2 岁以上失去了联系
虽然这个问题很久以前就发布了,但我希望回答,因为它可能对其他人有所帮助。这可以通过JOINKEYS
一个步骤轻松完成。这是伪代码:
JOINKEYS PAIRED(implicit)
并通过重新格式化归档来获取这两个记录。如果任何一个文件都不匹配,则附加/前缀一些特殊字符说'$'
'$'
,如果存在则它没有配对记录,它将被写入未配对文件并保留到配对文件。如果有任何问题,请务必回来。
//STEP01 EXEC SORT90MB
//SORTJNF1 DD DSN=INPUTFILE1,
// DISP=SHR
//SORTJNF2 DD DSN=INPUTFILE2,
// DISP=SHR
//SORTOUT DD DSN=MISMATCH_OUTPUT_FILE,
// DISP=(,CATLG,DELETE),
// UNIT=TAPE,
// DCB=(RECFM=FB,BLKSIZE=0),
// DSORG=PS
//SYSOUT DD SYSOUT=*
//SYSIN DD *
JOINKEYS FILE=F1,FIELDS=(1,79,A)
JOINKEYS FILE=F2,FIELDS=(1,79,A)
JOIN UNPAIRED,F1,ONLY
SORT FIELDS=COPY
/*
在 Eztrieve 中,这真的很简单,下面是一个如何编写代码的示例:
//STEP01 EXEC PGM=EZTPA00
//FILEA DD DSN=FILEA,DISP=SHR
//FILEB DD DSN=FILEB,DISP=SHR
//FILEC DD DSN=FILEC.DIF,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,(100,50),RLSE),
// UNIT=PRMDA,
// DCB=(RECFM=FB,LRECL=5200,BLKSIZE=0)
//SYSOUT DD SYSOUT=*
//SRTMSG DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
FILE FILEA
FA-KEY 1 7 A
FA-REC1 8 10 A
FA-REC2 18 5 A
FILE FILEB
FB-KEY 1 7 A
FB-REC1 8 10 A
FB-REC2 18 5 A
FILE FILEC
FILE FILED
FD-KEY 1 7 A
FD-REC1 8 10 A
FD-REC2 18 5 A
JOB INPUT (FILEA KEY FA-KEY FILEB KEY FB-KEY)
IF MATCHED
FD-KEY = FB-KEY
FD-REC1 = FA-REC1
FD-REC2 = FB-REC2
PUT FILED
ELSE
IF FILEA
PUT FILEC FROM FILEA
ELSE
PUT FILEC FROM FILEB
END-IF
END-IF
/*