我需要将多个记录合并为一个记录。每个要合并(转置)的记录块均由数字键标记。分隔符也可以是带有字符串CHG的记录。我尝试过调整大小,但它混合了不同的“块”记录。 “表”的数量可以在1到50之间。输入文件的LRECL为60因此,如果我的输入数据如下所示:
1 CHG
1 DATA
1 MOTIVE
1 table1
1 table2
1 table3
2 CHG
2 DATA
2 MOTIVO
2 table1
3 CHG
3 DATA
3 MOTIVE
3 table1
3 table2
3 table3
3 table4
3 table5
输出至少应为:
1 CHG 1 DATA 1 MOTIVE 1 table1 1 table2 1 table3
2 CHG 2 DATA 2 MOTIVE 2 table1
3 CHG 3 DATA 3 MOTIVE 3 table1 3 table2 3 table3 3 table4 3 table5
理想的输出(如果有帮助,我可以删除记录的第一个字节)
1 CHG DATA MOTIVE table1
1 CHG DATA MOTIVE table2
1 CHG DATA MOTIVE table3
2 CHG DATA MOTIVE table1
3 CHG DATA MOTIVE table1
3 CHG DATA MOTIVE table2
3 CHG DATA MOTIVE table3
3 CHG DATA MOTIVE table4
3 CHG DATA MOTIVE table5
这些是我最后的尝试,没有一个能正常工作:
//TOOLIN DD *
RESIZE FROM(INDD) TO(OUTDD1) TOLEN(600) USING(CTL1)
//TOOLIN DD *
RESIZE FROM(INDD) TO(OUTDD1) TOLEN(600) USING(CTL1)
//CTL1CNTL DD *
INREC BUILD=(1,50)
OUTFIL FNAMES=OUTDD1,OVERLAY=(1:1,600)
/ *
我刚想出以下SORT语句,
SORT FIELDS=(53,1,CH,A)
INREC IFTHEN=(WHEN=GROUP,BEGIN=(3,3,CH,EQ,C'CHG'),PUSH=(15:ID=1)),
IFTHEN=(WHEN=(3,3,CH,EQ,C'CHG'),BUILD=(1,5,47Z,15,1)),
IFTHEN=(WHEN=(3,4,CH,EQ,C'DATA'),BUILD=(6Z,3,4,42Z,15,1)),
IFTHEN=(WHEN=(3,6,CH,EQ,C'MOTIVE'),BUILD=(11Z,3,6,35Z,15,1)),
IFTHEN=(WHEN=(3,6,CH,EQ,C'TABLE1'),BUILD=(18Z,3,6,28Z,15,1)),
IFTHEN=(WHEN=(3,6,CH,EQ,C'TABLE2'),BUILD=(25Z,3,6,21Z,15,1)),
IFTHEN=(WHEN=(3,6,CH,EQ,C'TABLE3'),BUILD=(32Z,3,6,14Z,15,1)),
IFTHEN=(WHEN=(3,6,CH,EQ,C'TABLE4'),BUILD=(39Z,3,6,7Z,15,1)),
IFTHEN=(WHEN=(3,6,CH,EQ,C'TABLE5'),BUILD=(46Z,3,6,15,1))
SUM FIELDS=(1,8,9,8,17,8,25,8,33,8,41,8,49,4),FORMAT=BI
ALTSEQ CODE=(0040)
OUTREC FIELDS=(1,52,TRAN=ALTSEQ)
输入:
1 CHG
1 DATA
1 MOTIVE
1 TABLE1
1 TABLE2
1 TABLE3
2 CHG
2 DATA
2 MOTIVE
2 TABLE1
3 CHG
3 DATA
3 MOTIVE
3 TABLE1
3 TABLE2
3 TABLE3
3 TABLE4
3 TABLE5
输出:
1 CHG DATA MOTIVE TABLE1 TABLE2 TABLE3
2 CHG DATA MOTIVE TABLE1
3 CHG DATA MOTIVE TABLE1 TABLE2 TABLE3 TABLE4 TABLE5
我在WHEN=GROUP
中使用了我最喜欢的DFSORT
功能和二进制加法技术来实现此结果。有关这些功能和技术的更多详细信息,请参见SO的此answer,因为它也为Record Transpose问题提供了解决方案。
ALTSEQ CODE
将未使用的二进制零转换为最终输出中的空格。
尽管我相信此答案为您提供了实现输出的基本思路,但是对于6到50的表,您可能必须重复INREC IFTHEN
子句。
希望这会有所帮助。