JCL排序以分割主机数据集

3

我正在尝试将MF PS分成多个数据集。 例如,如果我有包含600条记录的数据集,我想将其分成6个每个100条记录的文件。是否可以使用JCL排序来实现这一点?

4个回答

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)是指您想要排序数据集的方式,以下是这个字段语句的含义:

21:要排序的字段的起始位置
5:要排序的字段长度
FS:浮点符号(有符号数值)
A:升序排列

DFSORT入门手册
Smart DFSORT技巧中有许多有用的示例和其他几种将记录拆分出数据集的方法。


我尝试运行这个作业。 它将记录拆分为3个文件。 但在这种情况下,第一个记录写入第一个文件,第二个记录写入第二个文件,以此类推。请问可以解释一下SORT FIELDS =(21,5,FS,A)的意义吗? 我尝试打开您提供的链接,但链接中的PDF无法打开...您能帮忙吗? - Manasi
我已经添加了FIELDS语句的含义。您希望按哪种方式拆分记录? - Deuian
我的输入文件已经排序好了,我只想将其拆分成几个文件。我使用了选项SORT FIELDS=COPY,对我来说它完美地工作了。非常感谢您的解决方案。它节省了我使用SKIPREC和STOPAFTER的时间... :) 非常感谢 :) - Manasi

2

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数据集的记录。


1
Deuian的SORT CARD将输入文件均匀地分成输出文件。例如,如果我们有3个输出文件,则总输入记录数除以3将是每个输入文件的记录计数。当然,我们可以根据要拆分的计数指定计数,如下所示。它隐式地将输入文件拆分为每个10000条记录的输出文件。例如,假设我们有40000条记录在输入文件中,并将它们分成3个输出文件,那么我们将在输出文件中获得10000+10000/3条记录。
OUTFIL FNAMES=(OUT1,OUT2,OUT3),SPLIT=10000
简而言之,在没有任何输出记录计数限制时,我们可以利用它。当我们在拆分时有任何这样的标准时,下面的代码片段会有所帮助...
SORT FIELDS=COPY OUTFIL FILES=OUT1,ENDREC=10000 OUTFIL FILES=02,STARTREC=10001,ENDREC=20000 OUTFIL FILES=03,STARTREC=20001,ENDREC=30000
最后,如果输入文件中的记录超过30000条,并且我们没有指定对这些记录要进行什么操作,那么SORT将不会处理它们。这意味着只有最后一个输出文件将保存10000条记录。
希望我已经解释清楚了。如果还有其他问题,请随时回复。

0
假设您不知道数据集中有多少记录,但您想要在两个输出数据集之间尽可能平均地分割这些记录。您可以使用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 Record 15 Record 17
同样,OUTFIL的SPLITBY=n参数将n条记录一次性拆分到由FNAMES指定的数据集中。以下语句将记录每四条分割一次,分别分配给三个OUTFIL数据集:   OPTION COPY OUTFIL FNAMES=(OUT1,OUT2,OUT3),SPLITBY=4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接