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.