根据JCL

时间:2017-05-18 08:16:36

标签: sorting jcl

我尝试在JCL中的字段中添加前面的零 但我尝试的所有想法都不符合我的要求。 我的要求是只在字段为数字时才添加前面的零 只有当字段有前面的空格时。

输入 Sample Input

123457 0 |  
34567R   |  
997654D3 |  
    45833|  
23       |  
   112456|  
  56  64 |  

预期输出 Sample output

123457 0 |  
34567R   |  
997654D3 |  
000045833|  
23       |  
000112456|  
  56  64 |  

我已经尝试了一些方法,但没有达到我的要求 我查看过查询Add zero padding to string in JCL,但在我的情况下不适用。

以下是我的尝试

方法1

//STEP0001 EXEC PGM=SORT                                       
//SYSOUT   DD SYSOUT=*                                         
//SYMNAMES DD *                                                
ALPHA,C'A, ,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z' 
//SORTIN   DD *                                                
123457 0                                                       
34567R                                                         
997654D3                                                       
    45833                                                      
23                                                             
//SORTOUT  DD SYSOUT=*                                         
//SYSIN    DD *                                                    
  SORT FIELDS=COPY                                                 
  INREC IFTHEN=(WHEN=(01,01,SS,EQ,ALPHA,OR,02,01,SS,EQ,ALPHA,OR,   
                      03,01,SS,EQ,ALPHA,OR,04,01,SS,EQ,ALPHA,OR,   
                      05,01,SS,EQ,ALPHA,OR,06,01,SS,EQ,ALPHA,OR,   
                      07,01,SS,EQ,ALPHA,OR,08,01,SS,EQ,ALPHA,OR,   
                      09,01,SS,EQ,ALPHA,OR,10,01,SS,EQ,ALPHA),     
  BUILD=(1,10)),                                                   
  IFTHEN=(WHEN=NONE,BUILD=(1,10,UFF,M11,LENGTH=10))                
//           

方法2

//STEP0001 EXEC PGM=SORT                                               
//SYSOUT   DD SYSOUT=*                                                 
//SORTIN   DD *                                                        
123457   0                                                             
34567                                                                  
997654                                                                 
4568 F ABC                                                             
23 1     1                                                             
//SORTOUT  DD SYSOUT=*                                                 
//SYSIN    DD *                                                        
  SORT FIELDS=COPY                                                     
  INREC IFOUTLEN=50,IFTHEN=(WHEN=INIT,OVERLAY=(51:1,10,TRAN=ALTSEQ)),  
  IFTHEN=(WHEN=(51,10,FS,EQ,NUM),OVERLAY=(1:1,10,UFF,M11,LENGTH=10))   
  ALTSEQ CODE=(40F0)                                                   
/*    

方法3

//STEP001  EXEC PGM=SORT                      
//SORTIN DD *                                 
764536 27                                     
0097865432                                    
00065499234                                   
00012342345                                   
12301231233                                   
//SORTOUT DD SYSOUT=*                         
//SYSIN DD *                                  
  OPTION COPY                                 
  INREC BUILD=(1,11,UFF,M11,LENGTH=11)        
//

注意:
- 如果我们能在ICETOOL中做到这一点会更好 - 其他排序方法也没问题。

2 个答案:

答案 0 :(得分:1)

这是使用SYNCSORT的可能解决方案。它也可以与DFSORT一起使用。

修改了解决方案以检查包含非数字字符或嵌入空格的值。

该示例说明了第1 - 5列中包含的数字字段。

"数字"假设仅表示数字0-9。处理标志(+/-)或小数点显然会更复杂。

此外,所需的大量控制语句使得此解决方案对于非常长的字段或大量字段而言不切实际。

如果可以使用的话,更好的选择是写一个排序例程来执行数据验证和零填充。

此解决方案的工作原理如下:

初始BUILD创建一个包含以下内容的临时记录:

cols 1 - 5:数据字段

cols 6 - 10:数据字段的副本,将用前导零填充

col 11:一个标志,指示数据字段是有效数字(空白)还是无效(' I')

col 12:跟踪数据字段状态的标志,在处理每个字符时更新。 (空白)=处理的所有字符都是空白的; (' N')=已处理非空白字符; (' B')=处理非空白字符后的尾随空白。

对于数据字段中的每个字符,有五个IFTHEN测试:

(1)如果该字符既不是空白也不是数字,则无效标志(第11栏)设置为“我”。

(2)如果该字符为非空白,且之前处理的所有字符均为空白,则状态标记(第12列)设置为“N'

(3)如果字符为空白,并且处理了非空白字符,则状态标志(第12栏)设置为' B'

(4)如果该字符是非空白的,并且处理了一个尾随的空白字符,则无效标志(第11列)被设置为“我”。 (因为数据字段包含嵌入的空白)。

(5)如果该字符为非空白,并且之前处理的所有字符均为空白,则数据副本(第6-10列)中的空白将替换为零。

处理完所有字符后:

如果该字段是无效数字数据或空白,则使用原始数据构建输出记录(第1 - 5栏)。

否则,输出记录是使用已用前导零(cols 6 - 10)填充的数据构建的。

//STEP1   EXEC PGM=SYNCSORT                                             
//SYSOUT   DD  SYSOUT=*                                                 
//SORTIN   DD  *                                                        
    1                                                                   
   1                                                                    
  1                                                                     
 1                                                                      
1                                                                       
   12                                                                   
  12                                                                    
 12                                                                     
12                                                                      
  123                                                                   
 123                                                                    
123                                                                     
 1234                                                                   
1234                                                                    
12345                                                                   

1 2                                                                     
 1 2                                                                    
  1 2                                                                   
1 23                                                                    
 1 23                                                                   
12 3                                                                    
 12 3                                                                   
    X                                                                   
   X                                                                    
  X                                                                     
 X                                                                      
X                                                                       
   1X                                                                   
  X1                                                                    
 1X                                                                     
1X                                                                      
  12X                                                                   
 12X                                                                    
1X3                                                                     
 12X4                                                                   
X234                                                                    
12X45                                                                   
/*                                                                      
//SORTOUT  DD  SYSOUT=*                                                 
//SYSIN    DD  *                                                        
 SORT FIELDS=COPY                                                       
 INREC IFTHEN=(WHEN=INIT,                                               
       BUILD=(1,5,1,5,C'  ')),                                          
         IFTHEN=(WHEN=(1,1,CH,NE,C' ',AND,1,1,FS,NE,NUM),               
          OVERLAY=(11:C'I'),                                            
                   HIT=NEXT),                                           
           IFTHEN=(WHEN=(1,1,CH,NE,C' ',AND,12,1,CH,EQ,C' '),           
            OVERLAY=(12:C'N'),                                          
                     HIT=NEXT),                                         
             IFTHEN=(WHEN=(1,1,CH,EQ,C' ',AND,12,1,CH,EQ,C'N'),         
              OVERLAY=(12:C'B'),                                        
                       HIT=NEXT),                                       
               IFTHEN=(WHEN=(1,1,CH,NE,C' ',AND,12,1,CH,EQ,C'B'),       
                OVERLAY=(11:C'I'),                                      
                         HIT=NEXT),                                     
                 IFTHEN=(WHEN=(1,1,CH,EQ,C' ',AND,12,1,CH,EQ,C' '),     
                  OVERLAY=(6:C'0'),                                     
                           HIT=NEXT),                                   
         IFTHEN=(WHEN=(2,1,CH,NE,C' ',AND,2,1,FS,NE,NUM),               
          OVERLAY=(11:C'I'),                                            
                   HIT=NEXT),                                           
           IFTHEN=(WHEN=(2,1,CH,NE,C' ',AND,12,1,CH,EQ,C' '),           
            OVERLAY=(12:C'N'),                                          
                     HIT=NEXT),                                         
             IFTHEN=(WHEN=(2,1,CH,EQ,C' ',AND,12,1,CH,EQ,C'N'),         
              OVERLAY=(12:C'B'),                                        
                       HIT=NEXT),                                       
               IFTHEN=(WHEN=(2,1,CH,NE,C' ',AND,12,1,CH,EQ,C'B'),       
                OVERLAY=(11:C'I'),                                      
                         HIT=NEXT),                                     
                 IFTHEN=(WHEN=(2,1,CH,EQ,C' ',AND,12,1,CH,EQ,C' '),     
                  OVERLAY=(7:C'0'),                                     
                           HIT=NEXT),                                   
         IFTHEN=(WHEN=(3,1,CH,NE,C' ',AND,3,1,FS,NE,NUM),               
          OVERLAY=(11:C'I'),                                            
                   HIT=NEXT),                                           
           IFTHEN=(WHEN=(3,1,CH,NE,C' ',AND,12,1,CH,EQ,C' '),           
            OVERLAY=(12:C'N'),                                          
                     HIT=NEXT),                                         
             IFTHEN=(WHEN=(3,1,CH,EQ,C' ',AND,12,1,CH,EQ,C'N'),         
              OVERLAY=(12:C'B'),                                        
                       HIT=NEXT),                                       
               IFTHEN=(WHEN=(3,1,CH,NE,C' ',AND,12,1,CH,EQ,C'B'),       
                OVERLAY=(11:C'I'),                                      
                         HIT=NEXT),                                     
                 IFTHEN=(WHEN=(3,1,CH,EQ,C' ',AND,12,1,CH,EQ,C' '),     
                  OVERLAY=(8:C'0'),                                     
                           HIT=NEXT),                                   
         IFTHEN=(WHEN=(4,1,CH,NE,C' ',AND,4,1,FS,NE,NUM),               
          OVERLAY=(11:C'I'),                                            
                   HIT=NEXT),                                           
           IFTHEN=(WHEN=(4,1,CH,NE,C' ',AND,12,1,CH,EQ,C' '),           
            OVERLAY=(12:C'N'),                                          
                     HIT=NEXT),                                         
             IFTHEN=(WHEN=(4,1,CH,EQ,C' ',AND,12,1,CH,EQ,C'N'),         
              OVERLAY=(12:C'B'),                                        
                       HIT=NEXT),                                       
               IFTHEN=(WHEN=(4,1,CH,NE,C' ',AND,12,1,CH,EQ,C'B'),       
                OVERLAY=(11:C'I'),                                      
                         HIT=NEXT),                                     
                 IFTHEN=(WHEN=(4,1,CH,EQ,C' ',AND,12,1,CH,EQ,C' '),     
                  OVERLAY=(9:C'0'),                                     
                           HIT=NEXT),                                   
         IFTHEN=(WHEN=(5,1,CH,NE,C' ',AND,5,1,FS,NE,NUM),               
          OVERLAY=(11:C'I'),                                            
                   HIT=NEXT),                                           
           IFTHEN=(WHEN=(5,1,CH,NE,C' ',AND,12,1,CH,EQ,C' '),           
            OVERLAY=(12:C'N'),                                          
                     HIT=NEXT),                                         
             IFTHEN=(WHEN=(5,1,CH,EQ,C' ',AND,12,1,CH,EQ,C'N'),         
              OVERLAY=(12:C'B'),                                        
                       HIT=NEXT),                                       
               IFTHEN=(WHEN=(5,1,CH,NE,C' ',AND,12,1,CH,EQ,C'B'),       
                OVERLAY=(11:C'I'),                                      
                       HIT=NEXT),                                       
                 IFTHEN=(WHEN=(5,1,CH,EQ,C' ',AND,12,1,CH,EQ,C' '),     
                  OVERLAY=(10:C'0'),                                    
                           HIT=NEXT),                                   
         IFTHEN=(WHEN=(11,1,CH,EQ,C'I',OR,12,1,CH,EQ,C' '),             
          BUILD=(1,5)),                                                 
         IFTHEN=(WHEN=(11,1,CH,NE,C'I',AND,12,1,CH,NE,C' '),            
          BUILD=(6,5))                                                  
/*                         

输出:

00001
0001 
001  
01   
1    
00012
0012 
012  
12   
00123
0123 
123  
01234
1234 
12345

1 2  
 1 2 
  1 2
1 23 
 1 23
12 3 
 12 3
    X
   X 
  X  
 X   
X    
   1X
  X1 
 1X  
1X   
  12X
 12X 
1X3  
 12X4
X234 
12X45

答案 1 :(得分:0)

我找到了使用SORT的问题的解决方案。

OPTION COPY                                                         
INREC IFTHEN=(WHEN=(13,12,CH,EQ,C' '),OVERLAY=(13:C'000000000000')),
      IFTHEN=(WHEN=(13,11,CH,EQ,C' '),OVERLAY=(13:C'00000000000')), 
      IFTHEN=(WHEN=(13,10,CH,EQ,C' '),OVERLAY=(13:C'0000000000')),  
      IFTHEN=(WHEN=(13,09,CH,EQ,C' '),OVERLAY=(13:C'000000000')),   
      IFTHEN=(WHEN=(13,08,CH,EQ,C' '),OVERLAY=(13:C'00000000')),    
      IFTHEN=(WHEN=(13,07,CH,EQ,C' '),OVERLAY=(13:C'0000000')),     
      IFTHEN=(WHEN=(13,06,CH,EQ,C' '),OVERLAY=(13:C'000000')),      
      IFTHEN=(WHEN=(13,05,CH,EQ,C' '),OVERLAY=(13:C'00000')),       
      IFTHEN=(WHEN=(13,04,CH,EQ,C' '),OVERLAY=(13:C'0000')),        
      IFTHEN=(WHEN=(13,03,CH,EQ,C' '),OVERLAY=(13:C'000')),         
      IFTHEN=(WHEN=(13,02,CH,EQ,C' '),OVERLAY=(13:C'00')),          
      IFTHEN=(WHEN=(13,01,CH,EQ,C' '),OVERLAY=(13:C'0'))