DFSORT常用语句小说明.doc

1.排序

语法:SORT FIELDS(数据起点,长度,数据类型,/降序)

例子:SORT FIELDS(100,9,ZD,A)  

数据类型:ZD/CH/PD  数字型/字符型/压缩型    BI/Binary(Numeric)

A/D 升序,降序

 

2.筛选

语法:INCLUDE COND=(数据起点,长度,数据类型,比较符,比较对象)

例子:INCLUDE COND=(99,1,CH,EQ,C'Y')

     INCLUDE COND=(99,1,ZD,EQ,0)

比较符:EQ/NE/GT/LT/GE/LE 等于,不等于,大于,小于,大于等于,小于等于

比较对象: 数字型/字符型

 

3.累加

语法:SUM FIELDS=(累加数据起点,长度,累加数据类型)

例子:SUM FIELDS=(77,13,ZD)

用法:和排序SORT FIELDS一起使用,SORT FIELDS是对相同FIELD的累加条件的界定.

 

特殊用法:SUM FIELDS=NONE

说明:对一个QSAM有多条相同数据,需要过滤掉多余数据,可使用以上语句,可以免写一个程序.

 

 

4.选择输入

语法:INREC FIELDS=(数据起点1,数据长度1,数据起点2,数据长度2,,,,,,,,)

例子:INREC FIELDS=(15,2,1,12,15,2,1,12,C'0',13,38)

 

5.选择输出

语法:OUTREC FIELDS=(数据起点1,数据长度1,数据起点2,数据长度2,,,,,,,,)

例子:OUTREC FIELDS=(1,2,C'04',5,54)

 

6.合并

用法:合并多个QSAM

例子:MERGE FIELDS=COPY

 

7.按ASCII排序

例如在PC排序是按ASCII 编码循序排序的(数字在字母前面)。

而主机的排序的循序刚好相反(数字在字母后面),在DFSort中如何使之按ASCII排序?


其实有个更简单的方法,只要在SORT的类型的地方写上AC就可以了,下面是我写的一个小模板供参考

//SORTF    JOB A,CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1), 
//         REGION=8M                                
//STEP0100 EXEC  PGM=SORT                           
//SYSOUT   DD SYSOUT=*                              
//SORTIN   DD *                                     
ADSFKSADF                                           
00ASFDSA                                            
S;LDGFDS                                            
327098432                                           
45FDSGFG                                            
C1FSADF                                             
DFSDGF                                              
C3SLKDF                                             
//SORTOUT DD SYSOUT=*                               
//SYSIN   DD *                                      
   SORT FIELDS=(1,3,AC,A)                           
/*

 

8.转换变长纪录到定长纪录

 

环境 MVS z/OS 
通过使用OUTFIL中的VTOF 或 CONVERT 和OUTREC 操作指令来修改输出的变长(VB)纪录到定长(FB)纪录。. VTOF 或CONVERT表明输出将被转换,而 OUTREC用于定义输出的纪录格式。所有使用VTOF 或CONVER指定的数据集必须是或将被创建成定长格式。
以下是 OUTFIL的转换示例:
SORT FIELDS=(7,8,CH,A)
OUTFIL FNAMES=FB1,VTOF,OUTREC=(5,76)
例中的FB1 输出数据集将包含输入变长数据的5-80数据。
如果输入的数据长度不足,DFSORT自动使用 VLFILL=C'x' 中指定的数据来补足不足的数据.而超长的纪录将被截断.
下边的例子将使用*来补足不足的数据.
SORT FIELDS=(7,8,CH,A)
OUTFIL FNAMES=FB1,VTOF,OUTREC=(5,76),VLFILL=C'*'

 

9.Splice

 

splice是sort中一个非常有用的功能,可以把输入文件中记录含有相同字段的记录进行合并

下面举个小例子来说明splice用法

//SORTTST4 JOB 'AAAAAAA',MSGLEVEL=(1,1),MSGCLASS=X,NOTIFY=&SYSUID 
//S1 EXEC PGM=ICETOOL                                             
//TOOLMSG DD SYSOUT=*                                             
//DFSMSG DD SYSOUT=*                                              
//IN   DD *                                                       
REC1 FATHER1                                                      
REC1          CHILD11                                             
REC1          CHILD12                                             
REC1          CHILD13                                             
REC2 FATHER2                                                      
REC2          CHILD21                                             
REC2          CHILD22                                             
REC3 FATHER3                                                      
REC4 FATHER4                                                      
REC4          CHILD41                                             
REC5 FATHER5                                                      
REC5          CHILD51                                             
REC5          CHILD52                                             
REC5          CHILD53                                             
/*                                                                
//OUT  DD SYSOUT=*                                                
//TOOLIN DD *                                                     
  SPLICE FROM(IN) TO(OUT) ON(1,4,CH) WITH(15,7) WITHALL KEEPNODUPS
/*                                                                

输出结果文件

REC1 FATHER1  CHILD11
REC1 FATHER1  CHILD12
REC1 FATHER1  CHILD13
REC2 FATHER2  CHILD21
REC2 FATHER2  CHILD22
REC3 FATHER3        
REC4 FATHER4  CHILD41
REC5 FATHER5  CHILD51
REC5 FATHER5  CHILD52
REC5 FATHER5  CHILD53

可通过调整withall witheach keepnodups等选项来进行不同合并操作

在这个小例子中所有含有father的记录分别和含有child的记录合并到一条记录上

 

10.change

 

DFSORT 提供了CHNAGE功能来实现替换功能

例子:
//SORT5    JOB 'AAAAAAA',MSGLEVEL=(1,1),MSGCLASS=X
//STEP020  EXEC PGM=ICEMAN
//SORTIN   DD DATA                               
REC1 11 ALDKFJSDAF                               
REC2 22 52435345                                 
REC3 22 EWQREWQR                                 
REC4 33 RTRTWET                                  
REC5 45 EWRTERWT                                 
REC6 11 65463643                                 
/*                                               
//SORTOUT  DD SYSOUT=*                           
//SYSIN    DD *                                  
  SORT     FIELDS=COPY                           
  OUTFIL   FNAMES=SORTOUT,                       
           OUTREC=(1,22,                         
                   6,2,CHANGE=(3,                
                   C'11',C'AAA',                 
                   C'22',C'BBB',                 
                   C'33',C'CCC',                 
                   C'44',C'DDD'),                
                   NOMATCH=(6,3),55X)            
/*             

输出:

REC1 11 ALDKFJSDAF    AAA
REC2 22 52435345      BBB
REC3 22 EWQREWQR      BBB
REC4 33 RTRTWET       CCC
REC5 45 EWRTERWT      45
REC6 11 65463643      AAA           

change表示第6位开始2位=11则输出3位aaa

                                        =22则输出3位bbb

                                        。。。。

nomatch标志如果change中=都没匹配到则输出第6位开始的三位

 

11.IFTHEN功能

 

DFSORT PTFs(UQ95214 and UQ95213)提供了很多增强功能
其中IFTHEN功能提供了根据记录内容不同而重组输出不同格式记录的功能
还是举一个最简单的例子最能说明问题
作业
//SORTTST1 JOB 'AAAAAAA',MSGLEVEL=(1,1),MSGCLASS=X,NOTIFY=&SYSUID
//S2    EXEC  PGM=ICEMAN                                         
//SYSOUT  DD  SYSOUT=*                                           
//SORTIN DD *                                                    
RECORD1 A OADD    123456789 AAAAAA                               
RECORD2 B ANJORE  234567890 BBBBBB                               
RECORD3 C TRICHY  345678901 CCCCCC                               
RECORD4   TSDAFSD 904378347 GGGGGG                               
RECORD5 A KARUR   456789012 DDDDDD                               
RECORD6 A PUNE    567890123 EEEEEE                               
RECORD7 C TRISUR  678901234 FFFFFF
/*                              
//SORTOUT DD SYSOUT=*                                            
//SYSIN DD *                                                     
  SORT FIELDS=COPY                                                        
  OUTREC IFTHEN=(WHEN=INIT,BUILD=(1,72,73:SEQNUM,8,ZD)),       
         IFTHEN=(WHEN=(9,1,CH,EQ,C'A'),OVERLAY=(9:11,6,15:20X)),
         IFTHEN=(WHEN=(9,1,CH,EQ,C'B'),OVERLAY=(9:19,9,18:17X)),
         IFTHEN=(WHEN=(9,1,CH,EQ,C'C'),OVERLAY=(9:29,6,15:20X)),
         IFTHEN=(WHEN=NONE,BUILD=(1,80))                       
/*                                                             
运行结果
RECORD1 OADD                                                            00000001
RECORD2 234567890                                                       00000002
RECORD3 CCCCCC                                                          00000003
RECORD4   TSDAFSD 904378347 GGGGGG                                      00000004
RECORD5 KARUR                                                           00000005
RECORD6 PUNE                                                            00000006
RECORD7 FFFFFF                                                          00000007

在本例中
WHEN=INIT,BUILD=(1,72,73:SEQNUM,8,ZD))
表示对每条记录先作初始处理,创建记录:取输入记录的1到72列,再跟8位行号

IFTHEN=(WHEN=(9,1,CH,EQ,C'A'),OVERLAY=(9:11,6,15:20X))
IFTHEN=(WHEN=(9,1,CH,EQ,C'B'),OVERLAY=(9:19,9,18:17X))
IFTHEN=(WHEN=(9,1,CH,EQ,C'C'),OVERLAY=(9:29,6,15:20X))
上述三条表示对每条初始处理后形成的记录,根据第9列不同取值来重组成不同的输出记录
如果第9列等于A,则把初始化后记录的第11列到16列,覆盖到第9列到14列,把20个空格覆盖到15列到34列
如果第9列等于B,则把初始化后记录的第19列到27列,覆盖到第9列到17列,把20个空格覆盖到18列到34列
如果第9列等于C,则把初始化后记录的第29列到37列,覆盖到第9列到14列,把20个空格覆盖到15列到34列

IFTHEN=(WHEN=NONE,BUILD=(1,80))
表示如果如果以上条件都不匹配则直接取初始化创建的记录

 

12.拆分文件

 

sort可以用来平均拆分文件。

//SORTTST3 JOB 'AAAAAAA',MSGLEVEL=(1,1),MSGCLASS=X,NOTIFY=&SYSUID     
//*------------------------------------------------------------------*
//S2    EXEC  PGM=ICEMAN                                              
//SYSOUT     DD  SYSOUT=*                                             
//SORTIN DD *                                                         
RECORD11111111                                                        
RECORD22222222                                                        
RECORD33333333                                                        
RECORD44444444                                                        
RECORD55555555                                                        
RECORD66666666                                                        
RECORD77777777                                                        
RECORD88888888                                                        
/*                                                                    
//FILE1   DD SYSOUT=*                                                 
//FILE2   DD SYSOUT=*                                                 
//FILE3   DD SYSOUT=*                                                 
//SYSIN    DD *                                                       
  SORT     FIELDS=COPY                                                
  OUTFIL   SPLIT,FNAMES=(FILE1,FILE2,FILE3)                           
/*                                         

文件1会包含 记录1 4 7

文件2会包含 记录2 5 8

文件3会包含 记录3 6    

 sort指定起始记录拆分

sort可以用来平均拆分文件。

//SORTTST3 JOB 'AAAAAAA',MSGLEVEL=(1,1),MSGCLASS=X,NOTIFY=&SYSUID     
//*------------------------------------------------------------------*
//S2    EXEC  PGM=ICEMAN                                              
//SYSOUT     DD  SYSOUT=*                                             
//SORTIN DD *                                                         
RECORD11111111                                                        
RECORD22222222                                                        
RECORD33333333                                                        
RECORD44444444                                                        
RECORD55555555                                                        
RECORD66666666                                                        
RECORD77777777                                                        
RECORD88888888                                                        
/*                                                                    
//FILE1   DD SYSOUT=*                                                 
//FILE2   DD SYSOUT=*                                                 
//FILE3   DD SYSOUT=*                                                 
//SYSIN    DD *                                                       
  SORT     FIELDS=COPY                                                
OUTFIL FNAMES=(FILE1),STARTREC=4,ENDREC=7
OUTFIL FNAMES=(FILE2),STARTREC=3,ENDREC=5
OUTFIL FNAMES=(FILE3),STARTREC=7,ENDREC=9

/*                                         

文件1会包含 记录4 5 6 7

文件2会包含 记录3 4 5

文件3会包含 记录7 8  
 
13.SFF(decimal point)数字统计

 

对于DECIMAL POINT数字的统计可以通过如下方式实现
//SORTTST2 JOB 'AAAAAAA',MSGLEVEL=(1,1),MSGCLASS=X,NOTIFY=&SYSUID
//S2    EXEC  PGM=ICEMAN                                         
//SYSOUT     DD  SYSOUT=*                                        
//SORTIN DD *                                                    
AAAAAAA    -130.04                                               
AAAAAAA    +50.10                                                
BBBBBBB    267.33                                                
BBBBBBB    -130.15                                               
CCCCCCC     32.22                                                
CCCCCCC    -100.75                                               
/*                                                               
//SORTOUT DD SYSOUT=*                                            
//SYSIN     DD    *                                              
INREC OVERLAY=(12:12,7,SFF,TO=ZD)                               
SORT FIELDS=(1,7,CH,A)                                          
SUM FIELDS=(12,7,ZD)                                            
OUTREC OVERLAY=(12:12,7,ZD,EDIT=(SIIT.TT),SIGNS=(,-))           
/*                                                               
结果:
AAAAAAA     -79.94
BBBBBBB     137.18
CCCCCCC     -68.53
首先在INREC中把SFF类型转换成ZD类型
SUM后输出时再把ZD格式转换成SFF
注意小数点后位数必须相等,否则结果会错位,如例子中+50.10不能写成50.1

 

14.OVERLAY

 

//STEP010   EXEC PGM=ICETOOL                  
//IN1       DD DISP=SHR,DSN=xxx.xxx  
//T1        DD DISP=SHR,DSN=xxx.xxx 
//TOOLMSG   DD SYSOUT=*                       
//DFSMSG    DD SYSOUT=*                       
//SYSPRINT  DD SYSOUT=*                       
//SYSOUT    DD SYSOUT=*                       
//TOOLIN    DD *                              
  COPY FROM(IN1) TO(T1) USING(CTL1)           
//CTL1CNTL DD *                                
  INREC OVERLAY=(10:C'11')            

File IN1 是FB、 80 长,内容如下:

AAAA

BBBB

CCCC 

我想象的结果是:对于输出文件的每条记录,在第十位会有11出现。

OVERLAY: Reformat each record by specifying just the items that overlay specific columns. Overlay lets you change specific existing columns without affecting the entire record.

 

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值