根据第一个字节将多条记录合并为一行
Posted
技术标签:
【中文标题】根据第一个字节将多条记录合并为一行【英文标题】:Combine multiple records into one line based on first byte 【发布时间】:2019-12-09 13:43:43 【问题描述】:我需要将多条记录合并为一条记录。要合并(转置)的每个记录块都由数字键标记。分隔符也可以是带有字符串 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)
/*
【问题讨论】:
无法使用 JCL 完成,因为 JCL 不操作数据。您似乎正在使用 DFSORT 或 SYNCSORT,因此标记应该是其中适当的一个。 【参考方案1】:我刚刚想出了以下 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
我在DFSORT
中使用了我最喜欢的WHEN=GROUP
功能和二进制加法技术来实现此结果。有关这些功能和技术的更多详细信息,请参阅我在 SO 中的 answer,因为它还为 Record Transpose 问题提出了解决方案。
ALTSEQ CODE
还用于将任何未使用的二进制零转换为最终输出中的空格。
虽然我相信这个答案为您提供了实现输出的基本概念,但您可能需要为 6 到 50 的表重复 INREC IFTHEN
子句。
希望这会有所帮助。
【讨论】:
以上是关于根据第一个字节将多条记录合并为一行的主要内容,如果未能解决你的问题,请参考以下文章
sqlserver查询一对多的关系、合并多条记录的某字段值到一个字段