使用排序重新格式化可变长度记录

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

我有一个带有逗号分隔记录的输入 每个字段都有不同的变量长度 例子 5467,2,567.82 243,10,856

现在我希望输出写成如下,输出中的第一个字段长度应为 10,第二个字段长度应为 15,第三个字段长度应为 15,并带有前导零

订单 0000005467 计数 000000000000002 金额 000000000567.82 订单 0000000243 数量 000000000000010 金额 000000000000856

我在jcl下面尝试过,但金额字段没有填充到右对齐,它填充到左对齐为567820000000.00


//STEP1   EXEC PGM=SYNCSORT

//SYSOUT  DD SYSOUT=*

//SORTIN  DD DSN=input,DISP=SHR

//SORTOUT DD DSN=output1,

//             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)),

   BUILD=(%00,%01,%02)

   OUTREC BUILD=(1,10,UFF,M11,LENGTH=10,

                 11,15,UFF,M11,LENGTH=15,

                 26,10,ZD,EDIT=(TTTTTTTT.TT))

/*

//STEP2   EXEC PGM=SYNCSORT

//SYSOUT  DD SYSOUT=*

//SORTIN  DD DSN=output1,DISP=SHR

//SORTOUT DD DSN=outputfinal,

//             DISP=(NEW,CATLG,DELETE),


//SYSOUT  DD SYSOUT=*

//SORTIN  DD DSN=TSO.TESTFIS.CDS.CNTRL.RPTS.TT61824,DISP=SH

//SORTOUT DD DSN=TSO.TESTFIS.CDS.CNTRL.RPTS.TT61824.FINALB,

//             DISP=(NEW,CATLG,DELETE),

//             UNIT=SYSDA,SPACE=(CYL,(5,5),RLSE)

//SYSIN   DD *

  OPTION COPY

  INREC PARSE=(%00=(FIXLEN=10),

               %01=(FIXLEN=15),

               %02=(FIXLEN=15)),

    BUILD=(C'ORDER # ',

           %00,

           C'  COUNT = ',

           %01,

           C' AMOUNT = ',

           %02)

/*


输出应该是 订单 0000005467 计数 000000000000002 金额 000000000567.82 订单 0000000243 数量 000000000000010 金额 000000000000856

sorting build mainframe jcl syncsort
1个回答
0
投票

您的输入既有带小数点的数字,也有纯整数。所以你需要以不同的方式处理它们

//STEP0100 EXEC PGM=SORT                                              
//SYSOUT   DD SYSOUT=*                                                
//SORTIN   DD *                                                       
5467,2,567.82                                                         
243,10,856                                                            
//SORTOUT  DD SYSOUT=*                                                
//SYSIN    DD *                                                       
  OPTION COPY                                                         
* parse the comma separated fields                                    
  INREC IFTHEN=(WHEN=INIT,                                            
         PARSE=(%01=(ENDBEFR=C',',FIXLEN=10),                         
                %02=(ENDBEFR=C',',FIXLEN=15),                         
                %03=(ENDBEFR=C',',FIXLEN=15)),                        
         BUILD=(%01,UFF,M11,LENGTH=10,                                
                %02,UFF,M11,LENGTH=15,                                
                %03)),                                                
                                                                      
* Check if the amount has decimal dot and parse it as number & decimal
                                                                      
        IFTHEN=(WHEN=(26,15,SS,EQ,C'.'),                              
         PARSE=(%04=(ABSPOS=26,ENDBEFR=C'.',FIXLEN=12),               
                %05=(FIXLEN=02)),                                     
       OVERLAY=(26:%04,UFF,M11,LENGTH=12,                             
                   C'.',                                              
                   %05,UFF,EDIT=(TT))),                               
                                                                      
* There is no decimal dot, so just pad leading zeroes                 
                                                                      
        IFTHEN=(WHEN=NONE,                                            
       OVERLAY=(26:26,15,UFF,M11,LENGTH=15))                          
                                                                      
* Write the final output                                              
                                                                      
  OUTREC BUILD=(C'ORDER ',01,10,                                      
                C' COUNT ',11,15,                                     
                C' AMOUNT ',26,15)                                    
                                                                      
/*                                                                    

上面的输出是

ORDER 0000005467 COUNT 000000000000002 AMOUNT 000000000567.82
ORDER 0000000243 COUNT 000000000000010 AMOUNT 000000000000856
© www.soinside.com 2019 - 2024. All rights reserved.