SYNCSORT将PD格式转换成CSF(FS)格式

客户要求看实时报表,可是从数据库导出来的数据却包含如下所示的显示不怎么友好的数据,这时可以用SORT来转换成客户想要的格式。
转换之前的文件用HEX ON命令显示如下。可以看出后面三个字段都是PD类型的,并且都占据8位长度。

VIEW       IBMUSER.DFSORT.PDTOCSF.SORTIN                   Columns 00001 00045 
Command ===> HEX ON                                            Scroll ===> CSR  
=COLS> ----+----1----+----2----+----3----+----4----+                           
****** ***************************** Top of Data ******************************
000001 AAAA,20130102,1,MD,     à? ,  é     ,  ? & i 
       CCCC6FFFFFFFF6F6DC600001670600512110600705380
       1111B20130102B1B44B0000440CB0013100CB0003049C
----------------------------------------------------
000002 BBBB,20130102,2,MD,        ,  è?íaà , ?-? d  
       CCCC6FFFFFFFF6F6DC600000000600745440604670800
       2222B20130102B2B44B0000000CB0147524CB0303743C
----------------------------------------------------
000003 CCCC,20130102,3,MD,      & ,  & -b? ,  & -b? 
       CCCC6FFFFFFFF6F6DC600031150600516860600516860
       3333B20130102B3B44B0011270CB0008026CB0008026C
----------------------------------------------------
000004 DDDD,20130102,4,MD,  é?ae? ,    de  ,      & 
       CCCC6FFFFFFFF6F6DC600544870600008840600000250
       4444B20130102B4B44B0016250DB0000450CB0000700D

转换要求:

  • 每条record的前面19位格式不变。后面三个PD字段中第一个PD字段保留6位小数,第二、三个PD字段保留3位小数;
  • 如果是负数,则保留符号'-',若是正数,省略'+';
  • 如果值是0,也要准确显示;

转换之后的文件如下,可以看出,转换结果完全满足客户对报表的需求。

 VIEW       IBMUSER.DFSORT.PDTOCSF.SORTOUT                  Columns 00001 00072 
 Command ===>                                                  Scroll ===> CSR  
 ****** ***************************** Top of Data ******************************
 000001 AAAA,20130102,1,MD,           1.464700,       51132110.100,       70035034.890
 000002 BBBB,20130102,2,MD,           0.000000,      174475542.440,     4360730784.030
 000003 CCCC,20130102,3,MD,        1311.217500,       50186082.660,       50186082.660
 000004 DDDD,20130102,4,MD,      -51464.285700,           8485.400,           -720.500 

要实现上面的数据转换,下面是我用到的SORT:

//IBMUSERS JOB '00000000',CLASS=0,NOTIFY=&SYSUID,       
//     MSGCLASS=R,TIME=NOLIMIT                                       
//SORT  EXEC  PGM=SYNCSORT                                             
//SORTIN   DD  DSN=IBMUSER.DFSORT.PDTOCSF.SORTIN,DISP=SHR                
//SORTOUT  DD  DSN=IBMUSER.DFSORT.PDTOCSF.SORTOUT,                   
//             DISP=(NEW,CATLG,DELETE),                              
//             UNIT=SYSDA,                                           
//             SPACE=(CYL,(1,2),RLSE),                               
//             DCB=(RECFM=FB,BLKSIZE=0)                              
//SYSOUT DD SYSOUT=*                                                              
//SYSIN  DD *                                                        
  SORT FIELDS=COPY                                                   
  INREC BUILD=(1,19,20,8,PD,EDIT=(SIIIIIIIIIIT.IIIIII),SIGNS=(,-,,), 
   C',',29,8,PD,EDIT=(SIIIIIIIIIIIIIT.III),SIGNS=(,-,,),             
   C',',38,8,PD,EDIT=(SIIIIIIIIIIIIIT.III),SIGNS=(,-,,)) 

这里面有3点要说明:
第1,在SORTOUT里面,DCB=(RECFM=FB,BLKSIZE=0)不必加LRECL参数,SORT会自动帮你算出来。
第2,SIGNS=(,-,,)的解释: blank for lp, '-' for ln, blank for tp, blank for tn.

leading positive  sign (lp)
leading negative  sign (ln)
trailing positive sign (tp) 
trailing negative sign (tn)

第3,原则上EDIT语句可以实现任意格式的输出要求。这里小数点前面的那个"T"是用来保证数据为0.000这种值的时候能正常输出,而不会输出blank。

Comments !