比较两个文件并将其写入“匹配”和“无匹配”文件

时间:2009-04-27 06:34:51

标签: mainframe syncsort dfsort easytrieve

我有两个输入文件,每个文件的长度为5200字节。七字节键用于比较两个文件,如果匹配则需要将其写入“匹配”文件,但在写入匹配文件时,我需要来自infile1的几个字段和来自{的所有其他字段{1}}。

如果没有匹配,则写入infile2文件。

是否可以在no match中执行此操作?我知道可以使用COBOL程序轻松完成,但只想知道sort

5 个答案:

答案 0 :(得分:8)

由于有12,200人查看了这个问题而未得到答案:

DFSORT和SyncSort是主要的大型机分拣产品。他们的控制卡有许多相似之处,也有一些差异。

JOINKEYS FILE=F1,FIELDS=(key1startpos,7,A)              
JOINKEYS FILE=F2,FIELDS=(key2startpos,7,A)              
JOIN UNPAIRED,F1,F2
REFORMAT FIELDS=(F1:1,5200,F2:1,5200)                         
SORT FIELDS=COPY    

“JOINKEYS”由三个任务组成。子任务1是第一个JOINKEYS。子任务2是第二个JOINKEYS。主要任务如下,是处理连接数据的位置。在上面的示例中,它是一个简单的COPY操作。连接的数据将简单地写入SORTOUT。

JOIN语句定义了匹配的记录,UNPAIRED F1和F2记录将被呈现给主任务。

REFORMAT语句定义将呈现给主任务的记录。想象一下F2需要三个字段的更有效的例子是:

 REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100)

F2上的每个字段都定义为起始位置和长度。

主要任务处理的记录长度为5311字节,F2的字段可以由5201,10,5211,1,5212,100引用,F1记录为1,5200。

实现同样目标的更好方法是使用JNF2CNTL减小F2的大小。

//JNF2CNTL DD *
  INREC BUILD=(207,1,10,30,1,5100,100)

某些SyncSort安装不支持JNF2CNTL,即使支持(从Syncsort MFX for z / OS版本1.4.1.0开始),SyncSort也没有记录。对于1.3.2或1.4.0的用户,可以从SyncSort获得更新以提供JNFnCNTL支持。

应该注意,默认情况下JOINKEYS使用选项EQUALS对数据进行排序。如果JOINKEYS文件的数据已经按顺序排列,则应指定SORTED。对于DFSORT,如果不需要序列检查,也可以指定NOSEQCHK。

 JOINKEYS FILE=F1,FIELDS=(key1startpos,7,A),SORTED,NOSEQCHK

虽然请求很奇怪,但由于无法确定源文件,所有不匹配的记录都将转到单独的输出文件。

使用DFSORT,有一个匹配标记,用?指定?在REFORMAT中:

 REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100,?)

这会将REFORMAT记录的长度增加一个字节。的?可以在REFORMAT记录的任何位置指定,无需指定。的?由DFSORT解析为:B,源自两个文件的数据; 1,来自F1的无与伦比的记录; 2,来自F2的无与伦比的记录。

SyncSort没有匹配标记。 REFORMAT记录中数据的缺失或存在必须由值确定。在两个输入记录上选择一个不包含特定值的字节(例如,在一个数字内,决定一个非数字值)。然后将该值指定为REFORMAT上的FILL字符。

 REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100),FILL=C'$'

如果F1上的位置1自然不能有“$”而F2上的位置20也不能,那么这两个位置可以用来确定匹配的结果。如有必要,可以测试整个记录,但会耗费更多的CPU时间。

表面要求是将所有来自F1或F2的不匹配记录写入一个文件。这将需要REFORMAT声明,其中包括两个完整的记录:

DFSORT,输出不匹配的记录:

  REFORMAT FIELDS=(F1:1,5200,F2:1,5200,?)

  OUTFIL FNAMES=NOMATCH,INCLUDE=(10401,1,SS,EQ,C'1,2'),
        IFTHEN=(WHEN=(10401,1,CH,EQ,C'1'),
                    BUILD=(1,5200)),
        IFTHEN=(WHEN=NONE,
                    BUILD=(5201,5200))

SyncSort,输出不匹配的记录:

  REFORMAT FIELDS=(F1:1,5200,F2:1,5200),FILL=C'$'

  OUTFIL FNAMES=NOMATCH,INCLUDE=(1,1,CH,EQ,C'$',
                          OR,5220,1,CH,EQ,C'$'),
        IFTHEN=(WHEN=(1,1,CH,EQ,C'$'),
                    BUILD=(1,5200)),
        IFTHEN=(WHEN=NONE,
                    BUILD=(5201,5200))

SyncSort的编码也适用于DFSORT。

获取匹配的记录很容易。

  OUTFIL FNAMES=MATCH,SAVE

SAVE确保所有未由其他OUTFIL写入的记录都将写入此处。

需要重新格式化,主要从F1输出数据,但要从F2中选择一些字段。这适用于DFSORT或SyncSort:

  OUTFIL FNAMES=MATCH,SAVE,
     BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929)

整个事情,任意的开始和长度是:

DFSORT

  JOINKEYS FILE=F1,FIELDS=(1,7,A)              
  JOINKEYS FILE=F2,FIELDS=(20,7,A)    

  JOIN UNPAIRED,F1,F2

  REFORMAT FIELDS=(F1:1,5200,F2:1,5200,?)                         

  SORT FIELDS=COPY    

  OUTFIL FNAMES=NOMATCH,INCLUDE=(10401,1,SS,EQ,C'1,2'),
        IFTHEN=(WHEN=(10401,1,CH,EQ,C'1'),
                    BUILD=(1,5200)),
        IFTHEN=(WHEN=NONE,
                    BUILD=(5201,5200))

  OUTFIL FNAMES=MATCH,SAVE,
     BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929)

Syncsort的

  JOINKEYS FILE=F1,FIELDS=(1,7,A)              
  JOINKEYS FILE=F2,FIELDS=(20,7,A)              

  JOIN UNPAIRED,F1,F2

  REFORMAT FIELDS=(F1:1,5200,F2:1,5200),FILL=C'$'                         

  SORT FIELDS=COPY    

  OUTFIL FNAMES=NOMATCH,INCLUDE=(1,1,CH,EQ,C'$',
                          OR,5220,1,CH,EQ,C'$'),
        IFTHEN=(WHEN=(1,1,CH,EQ,C'$'),
                    BUILD=(1,5200)),
        IFTHEN=(WHEN=NONE,
                    BUILD=(5201,5200))

  OUTFIL FNAMES=MATCH,SAVE,
     BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929)

答案 1 :(得分:0)

我在大约2年前使用过JCL,所以不能为你编写代码,但这是想法;

  1. 有2个步骤
  2. 第一步将有ICETOOl,您可以在其中将匹配的记录写入匹配的文件。
  3. 其次,您可以使用SORT / ICETOOl或仅通过文件操作来编写不匹配的文件。
  4. 我再次为没有代码的解决方案道歉,但我已经失去联系了2年+

答案 2 :(得分:0)

在Eztrieve中它非常简单,下面是一个如何编写代码的示例:

//STEP01   EXEC PGM=EZTPA00                                        
//FILEA    DD DSN=FILEA,DISP=SHR   
//FILEB    DD DSN=FILEB,DISP=SHR
//FILEC    DD DSN=FILEC.DIF,    
//            DISP=(NEW,CATLG,DELETE),                             
//            SPACE=(CYL,(100,50),RLSE),                           
//            UNIT=PRMDA,                                          
//            DCB=(RECFM=FB,LRECL=5200,BLKSIZE=0)                  
//SYSOUT   DD SYSOUT=*                                             
//SRTMSG   DD SYSOUT=*                                             
//SYSPRINT DD SYSOUT=*                                             
//SYSIN    DD *                                                    
 FILE FILEA                                                        
   FA-KEY       1   7 A                                         
   FA-REC1      8  10 A
   FA-REC2     18   5 A

 FILE FILEB                                                        
   FB-KEY       1   7 A                                         
   FB-REC1      8  10 A                                         
   FB-REC2     18   5 A                                         

 FILE FILEC                                                        

 FILE FILED                                                        
   FD-KEY       1   7 A                                         
   FD-REC1      8  10 A                                         
   FD-REC2     18   5 A                                         


 JOB INPUT (FILEA KEY FA-KEY FILEB KEY FB-KEY)                     
   IF MATCHED            
      FD-KEY   =  FB-KEY                                      
      FD-REC1  =  FA-REC1
      FD-REC2  =  FB-REC2
      PUT FILED
   ELSE
      IF FILEA
         PUT FILEC FROM FILEA                                         
      ELSE
         PUT FILEC FROM FILEB
      END-IF                                         
   END-IF                                                          
/*                       

答案 3 :(得分:0)

尽管这个问题已经发布了很长时间,但我希望回答这个问题,因为它可能有助于其他人。这可以通过单个步骤中的JOINKEYS轻松完成。这里是伪代码:

  • 代码JOINKEYS PAIRED(implicit)并通过重新格式化文件获取两个记录。如果任何一个文件都没有匹配,则附加/前缀一些特殊字符'$'
  • 通过IFTHEN对'$'进行比较,如果存在,那么它没有配对记录,它将被写入未配对文件并休息到配对文件。

请回答任何问题。

答案 4 :(得分:0)

//STEP01   EXEC SORT90MB                        
//SORTJNF1 DD DSN=INPUTFILE1,   
//            DISP=SHR                          
//SORTJNF2 DD DSN=INPUTFILE2,   
//            DISP=SHR                          
//SORTOUT  DD DSN=MISMATCH_OUTPUT_FILE, 
//            DISP=(,CATLG,DELETE),             
//            UNIT=TAPE,                        
//            DCB=(RECFM=FB,BLKSIZE=0),         
//            DSORG=PS                          
//SYSOUT   DD SYSOUT=*                          
//SYSIN    DD *                                 
  JOINKEYS FILE=F1,FIELDS=(1,79,A)              
  JOINKEYS FILE=F2,FIELDS=(1,79,A)              
  JOIN UNPAIRED,F1,ONLY                         
  SORT FIELDS=COPY                              
/*