使用SYNCSORT格式化变长逗号分隔记录的问题求助
问题描述
- 输入数据:逗号分隔的变长记录,示例如下:
5467,2,567.82 243,10,856 - 期望输出:三个字段分别补前导零至指定长度,格式要求:
- 第一个字段(订单号):长度10位
- 第二个字段(数量):长度15位
- 第三个字段(金额):长度15位,带小数的保留两位小数,整数则直接补零
示例输出:
Order 0000005467 count 000000000000002 amount 000000000567.82 Order 0000000243 count 000000000000010 amount 000000000000856 - 现有JCL问题:金额字段未实现右对齐,出现左对齐的错误格式(如
567820000000.00)
修正后的SYNCSORT JCL
可以通过单步SYNCSORT完成处理,无需中间文件,修正后的JCL如下:
//SORTPROC EXEC PGM=SYNCSORT //SYSOUT DD SYSOUT=* //SORTIN DD DSN=input,DISP=SHR //SORTOUT DD DSN=outputfinal, // DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(CYL,(5,5),RLSE) //SYSIN DD * OPTION COPY INREC PARSE=(%00=(ENDBEFR=C',',FIXLEN=10), %01=(ENDBEFR=C',',FIXLEN=15), %02=(FIXLEN=15)), IFTHEN=(WHEN=(%02,SS,NE,C'.'), BUILD=(C'Order ', %00,UFF,EDIT=(TTTTTTTTTT),LENGTH=10, C' count ', %01,UFF,EDIT=(TTTTTTTTTTTTTTT),LENGTH=15, C' amount ', %02,UFF,EDIT=(TTTTTTTTTTTTTTT),LENGTH=15)), IFTHEN=(WHEN=NONE, BUILD=(C'Order ', %00,UFF,EDIT=(TTTTTTTTTT),LENGTH=10, C' count ', %01,UFF,EDIT=(TTTTTTTTTTTTTTT),LENGTH=15, C' amount ', %02,PD,EDIT=(TTTTTTTTTTTTTT.TT),LENGTH=15)) /*
关键修正说明
- 字段拆分:用
PARSE指令拆分逗号分隔的三个字段,分别存入临时变量%00(订单号)、%01(数量)、%02(金额) - 订单号/数量处理:通过
UFF,EDIT=(TT...)将无符号数字转换为指定长度的字符串,自动补前导零实现右对齐 - 金额字段条件处理:
- 当金额为整数(不包含小数点)时,用
UFF,EDIT=(TTTTTTTTTTTTTTT)生成15位前导零填充的整数 - 当金额带小数时,先转换为压缩十进制(PD)类型确保数值解析正确,再用
EDIT=(TTTTTTTTTTTTTT.TT)格式化为15位带小数点的字符串,自动右对齐补前导零
- 当金额为整数(不包含小数点)时,用
内容的提问来源于stack exchange,提问作者Sahi
相关产品推荐
相关产品推荐

