我正在尝试将 MF PS 分成几个数据集。例如,如果我有一个包含 600 条记录的数据集,我想将它分成 6 个文件,每个文件有 100 条记录。是否可以使用 JCL 排序来做到这一点?
4 回答
下面的 JCL 使用 DFSORT 将 DD SOTRIN 均匀地拆分到 3 个输出数据集(OUT1、OUT2 和 OUT3)中,以在 6 个添加 3 个输出 DD 语句并将它们添加到 FNAMES 语句中执行此操作。
//SPLIT EXEC PGM=ICEMAN
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=Y897797.INPUT1,DISP=OLD
//OUT1 DD DSN=Y897797.SPLIT1,DISP=(NEW,CATLG),
// SPACE=(CYL,(5,5)),UNIT=SYSDA
//OUT2 DD DSN=Y897797.SPLIT2,DISP=(NEW,CATLG),
// SPACE=(CYL,(5,5)),UNIT=SYSDA
//OUT3 DD DSN=Y897797.SPLIT3,DISP=(NEW,CATLG),
// SPACE=(CYL,(5,5)),UNIT=SYSDA
//SYSIN DD *
SORT FIELDS=(21,5,FS,A)
OUTFIL FNAMES=(OUT1,OUT2,OUT3),SPLIT
/*
SORT FIELDS=(21,5,FS,A) 是您希望对 sortint 数据集进行排序的方式,以下是该字段语句的含义
21 待排序字段的开头
5 待排序字段的长度
FS Floating Sign (Signed Numeric)
A 升序
DFSORT 入门手册
Smart DFSORT Tricks有很多有用的示例和其他几种将记录从数据集中拆分出来的方法
SPLIT 就是 SPLIT,你不能把它和一个数字联系起来。
SPLITBY=n 将在每个指定的 OUTFIL 数据集之间“旋转”n 条记录。SPLIT 与 SPLITBY=1 相同。
SPLIT1R=n 只会执行一次“轮换”(n 条记录将被写入第一个 OUTFIL 数据集,然后 n 条记录到第二个 OUTFIL 并像这样继续,直到使用最终的 OUTFIL 数据集,其中将包含输入的任何剩余记录,否不管有多少。
不允许使用 OUTFIL FILES=OUT1。应该是 OUTFIL FNAMES=(OUT1,OUT2,OUT3),SPLIT。
如果使用 STATREC/ENDREC 或 INCLUDE/OMIT,OUTFIL SAVE 可用于为未写入任何其他 OUTFIL 数据集的记录建立文件。
- Deuian 的 SORT CARD 将输入文件平均拆分为输出文件。例如,如果我们有3 个输出文件,则输入记录总数除以 3 将是每个输入文件的记录数。
- 在 cos 中,我们可以根据应该发生的拆分来指定计数,如下所示。它隐式地将输入文件拆分为每个输出文件 10000 条记录。例如,我们在输入文件中有 40000 条记录,我们将它们分成 3 个输出文件,那么我们将在输出文件中获得 10000+10000/3 条记录。
OUTFIL FNAMES=(OUT1,OUT2,OUT3),SPLIT= 10000
- 简而言之,当我们对输出记录数没有任何限制时,我们可以使用它。当我们在拆分时有任何这样的标准时,下面的代码会有所帮助......
排序字段=复制
外部文件=OUT1,ENDREC=10000
外部文件=02,STARTREC=10001,ENDREC=20000 外部文件=03,STARTREC=20001,ENDREC=30000
- 最后,如果我们在输入文件中有超过 30000 条记录,并且我们没有指定对这些记录做什么,那么 SORT 不会理会它们。这意味着最后一个输出文件将只保存 10000 条记录。
希望我让你清楚。如果有进一步的问题,一定要回来。
假设您不知道数据集中有多少条记录,但您希望在两个输出数据集之间尽可能平均地划分记录。您可以使用 OUTFIL 的 SPLIT 参数将第一条记录放入 OUTPUT1,将第二条记录放入 OUTPUT2,将第三条记录放入 OUTPUT1,将第四条记录放入 OUTPUT2,以此类推,直到记录用完为止。SPLIT 在 FNAMES 指定的数据集中一次一个地拆分记录。以下语句在两个 OUTFIL 数据集之间拆分记录: OPTION COPY OUTFIL FNAMES=(OUTPUT1,OUTPUT2),SPLIT 对于 17 条输入记录,为 OUTPUT1 生成的结果为: Record 01 Record 03 Record 05 Record 07 Record 09 Record 11 Record 13记录 15 记录 17
类似地,OUTFIL 的 SPLITBY=n 参数在 FNAMES 指定的数据集中一次拆分记录 n。以下语句在三个 OUTFIL 数据集之间一次拆分四个记录: OPTION COPY OUTFIL FNAMES=(OUT1,OUT2,OUT3),SPLITBY=4