我想要一个JCL排序卡将数据集中第n列到第n + k列的所有记录写入新文件。怎么做到这一点?

时间:2017-02-15 18:20:38

标签: jcl dfsort

1234 ABCD  
3991 ABCD
3818 ABCD
1939 PQRS
2838 PQRS
1939 ABCD
2819 PQRS
2102 FILQ
2911 ABCD
3912 FILQ

我想用ABCD写一个文件中的所有记录,所有记录PQRS在一个文件中所有记录中的FILQ都在一个文件中,依此类推。我不知道这些专栏将会是什么。

2 个答案:

答案 0 :(得分:3)

如果要基于具有您不知道的值的固定位置拆分为多个文件,则需要对数据进行排序(在要拆分的字段上)并在OUTREC上使用WHEN = GROUP有多少东西可以在多个OUTFIL中包含。

//SYSIN    DD * 
  SORT FIELDS=(6,4,CH,A) 
  OUTREC IFTHEN=(WHEN=GROUP, 
                 KEYBEGIN=(6,4), 
                 PUSH=(81:ID=2)) 

  OUTFIL INCLUDE=(81,2,CH,EQ,C'01'),
         FNAMES=OUT1, 
         BUILD=(1,80) 
  OUTFIL INCLUDE=(81,2,CH,EQ,C'02'),
         FNAMES=OUT2, 
         BUILD=(1,80) 
  OUTFIL SAVE, 
         FNAMES=OUTA, 
         BUILD=(1,80) 
//SORTIN   DD * 
1234 ABCD 
3991 ABCD 
3818 ABCD 
1939 PQRS 
2838 PQRS 
1939 ABCD 
2819 PQRS 
2102 FILQ 
2911 ABCD 
3912 FILQ 

给出:

OUT1
1234 ABCD
1939 ABCD
2911 ABCD
3991 ABCD
3818 ABCD

OUT2
3912 FILQ
2102 FILQ

OUTA
1939 PQRS
2819 PQRS
2838 PQRS

我使用了80字节的固定长度记录进行测试。如果您的记录长度不同,请将所有对81的引用更改为您的记录长度加一,并将所有对80的引用更改为记录长度。

如果您的数据在可变长度记录上,您应该先前提到它。代码不同。

WHEN = GROUP定义一个组,并允许将组定义中的信息应用于组中的所有记录(使用PUSH)。有两个可用的特殊字段,ID(组的序列号)和SEQ(组内的序列号)。 ID = 2表示组的两位数序列号。在代码开始出错之前,这允许最多100个组。

将有10个OUTFIL(我显示3个)。对于最终的OUTFIL(我称之为OUTA),我建议使用SAVE而不是INCLUDE。 SAVE表示“所有不在另一个OUTFIL上的记录都在这里”。即使你有超过10组,至少你会拥有所有数据(直到你超过100组)。

PUSH类似于OVERLAY,除了它不能使用任何类型的文字值,只能使用上面提到的特殊字段和定义该组的记录中的任何数据。

此PUSH将扩展记录。为了使其成为临时扩展,每个OUTFIL中的BUILD将每个记录返回到其原始大小。

答案 1 :(得分:1)

假设您需要排序的值不会随时更改,您可以使用以下内容:

//STEP1 EXEC PGM=ICEMAN
//SYSOUT DD SYSOUT=*
//SYSIN  DD DSN=YOUR.INPUT.FILE,DISP=OLD
//OUT1   DD DSN=OUTPUT.FILE.ONE,DISP(NEW,CATLG),
//          SPACE=(CYL,(5,5),UNIT=SYSDA
//OUT2   DD DSN=OUTPUT.FILE.TWO,DISP(NEW,CATLG),
//          SPACE=(CYL,(5,5),UNIT=SYSDA
//SYSIN DD *
  OPTION COPY
  OUTFIL INCLUDE=(6,4,CH,EQ,C'ABCD'),FNAMES=OUT1
  OUTFIL INCLUDE=(6,4,CH,EQ,C'PQRS'),FNAMES=OUT2
/*

然后你可以根据需要重复这个次数。

基本上,您只需要搜索文字的特定位置(在本例中为位置6,长度为4),然后指定输出数据集。

显然你的空间参数可能与我使用的不同,但这应该足以让你走了!