我个人不是很喜欢ISPF 3.13提供的两个Dataset比较的功能,总觉得看得不是很直观。平时,我还是比较习惯用winmerge这个软件来比较。但是有个问题,就是比较的两个程序经常在第72列至80列的行号不一致,导致没法比较。所以,这篇文章我就来总结一下,如何去掉DATASET的第72列至80列内容。
方法一:直接在ISPF下面用命令去掉
这是最直接最快的办法。去掉第72列至80列的命令有下面两个:
NUM ON; UNNUMB
C P'^' ‘ ‘ 73 80 ALL /* Changes all non-space characters to spaces in col 73 to 80*/
方法二:用第三方脚本实现
上面的方法如果是只有少数几个程序,那么手动命令去掉第72列至80列没什么。但是如果你一下子需要对几百个dataset或者同一个PDS下面的所有member去掉第72列至80列,则最好最快的办法是将所有代码通过FTP下载到本地,然后用第三方脚本语言(如VB,Phthon,Ruby,JS等)来解决了。以下就附上一段我自己写的Ruby脚本,该脚本的作用是将C:\prod文件夹下面的所有程序的第72列至80列内容置空,然后输出到文件夹C:\prod72col下面。可以看到,用第三方脚本实现批量的任务是很方便的。
01 def cutto72col(file_in,file_out)
02 file_in=File.new(file_in,‘r’)
03 file_out=File.new(file_out,‘w’)
04 oneline=file_in.gets
05 while(oneline != nil)
06 oneline=oneline.chomp
07 oneline=oneline[0..71]
08 file_out.puts oneline
09 oneline=file_in.gets
10 end
11 end
12
13 path_in=‘C:\prod\\’
14 path_out=‘C:prod72col\\’
15
16 Dir.foreach(path_in){ |file|
17 if file != ‘.’ && file != ‘..’
18 then
19 file_in = path_in + file
20 cutto72col(file_in,path_out + file)
21 end }
当然,你还可以直接在大机上面,用REXX脚本直接对整个PDS操作,移去所有member的第72列至80列内容。以下也附上我自己写的REXX脚本,该脚本的内容是将IBMUSER.TEST.PRGM这个PDS下面所有的member的第72列至第80列的行号都去掉:
(暂时没找到如何比较完美地在这里贴REXX语法高亮的代码,等我找到方法了再帖上来)
PS:今天找到怎么比较好地在wordpress贴带有Rexx代码高亮的方式了,续上,代码如下:
/***********************REXX******************************************/
/*Loop PDS to remove whatever between col72 to col80 for each member */
/**********************************************************************/
/* Trace i */
pdsname = 'TEST.PRGM' /*Check if pds is exsited */
if sysdsn(pdsname)<> "OK" then
do
say "Error: Specified PDS not found:" pdsname
say "Error: " pdsname " > " sysdsn(pdsname)
say "Press Enter to continue"
pull uresp
exit 8
end
call outtrap "mbrs." /*call outtrap to capture LISTD output */
"LISTD" pdsname "MEMBERS" /*List member list*/
call outtrap "off" /*Turn off outtrap*/
do i=1 to mbrs.0
/*SAY "mbrs." !! i !! ": " !! mbrs.i */
if mbrs.i = "--MEMBERS--" then
do
leave
end
end
/*start to loop on each member*/
i = i+1
do j=i to mbrs.0 /*mbrs.0 is the total line num of LISTD */
/*SAY "mbrs." !! j !! ": " !! mbrs.j */
parse value mbrs.j with mem /*split mbrs.j*/
mem =strip(mem) /*remove leading and trailing character*/
pds = 'IBMUSER.TEST.PRGM'
mpds = pds !!'(' !! mem !! ')'
"ISPEXEC EDIT DATASET('"mpds"') MACRO(MACRO01)"
end
这是上面主Rexx程序调用的MACRO01:
/*****************************REXX***********************************/
ADDRESS ISPEXEC
"ISREDIT MACRO"
"ISREDIT RES"
"ISREDIT NUM ON"
"ISREDIT UNNUM"
"ISREDIT SAVE"
"ISREDIT END"