ISPF下如何去掉程序的第72至80列

个人不是很喜欢ISPF 3.13提供的两个Dataset比较的功能,总觉得看得不是很直观。平时还是比较习惯用windows下面的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下面。可以看到,用第三方脚本实现批量的任务是很方便的。
```ruby01 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操作,移去该PDS下所有member的第72列至80列内容。这里也附上我的REXX脚本,作用是将**`IBMUSER.TEST.PRGM`**这个PDS下面所有的member的第72列至第80列的行号都去掉:  
```ruby
/***********************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" 

Comments !