根据第一个字节将多条记录合并为一行

问题描述 投票:0回答:1

我需要将多个记录合并为一个记录。每个要合并(转置)的记录块均由数字键标记。分隔符也可以是带有字符串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)                   

/ *

mainframe jcl
1个回答
0
投票

我刚想出以下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子句。

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.