1234 ABCD
3991 ABCD
3818 ABCD
1939 PQRS
2838 PQRS
1939 ABCD
2819 PQRS
2102 FILQ
2911 ABCD
3912 FILQ
我想用ABCD写一个文件中的所有记录,所有记录PQRS在一个文件中所有记录中的FILQ都在一个文件中,依此类推。我不知道这些专栏将会是什么。
答案 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),然后指定输出数据集。
显然你的空间参数可能与我使用的不同,但这应该足以让你走了!