【问题标题】:Compare two files and write it to "match" and "nomatch" files比较两个文件并将其写入“匹配”和“不匹配”文件
【发布时间】:2009-04-27 06:34:50
【问题描述】:

我有两个输入文件,每个文件的长度为 5200 字节。一个七字节的密钥用于比较两个文件,如果有匹配项,则需要将其写入“匹配”文件,但在写入匹配文件时,我需要来自infile1 的一些字段和来自infile2 的所有其他字段.

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

sort 可以做到吗?我知道使用 COBOL 程序可以轻松完成,但只想知道SORT/ICETOOL/Easytrieve Plus (EZTPA00)

【问题讨论】:

    标签: mainframe syncsort dfsort easytrieve


    【解决方案1】:

    自从 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 语句定义了与匹配的记录一样,未配对的 F1 和 F2 记录将呈现给主任务。

    REFORMAT 语句定义了将呈现给主任务的记录。假设 F2 需要三个字段,一个更有效的示例是:

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

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

    然后被Main任务处理的记录长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))
    

    同步排序,输出不匹配的记录:

      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)
    

    同步排序

      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)
    

    【讨论】:

      【解决方案2】:

      大约 2 年前我使用过 JCL,因此无法为您编写代码,但这是我的想法;

      1. 有 2 个步骤
      2. 第一步将有 ICETOOl,您可以在其中将匹配的记录写入匹配的文件。
      3. 其次,您可以使用 SORT/ICETOOl 或仅通过文件操作来编写不匹配的文件。

      我再次为没有代码的解决方案道歉,但我已经 2 年以上失去联系了

      【讨论】:

      • 不需要两个步骤。不需要 ICETOOL。用 JOINKEYS 排序就可以了。无论如何,从所描述的情况来看。
      【解决方案3】:

      虽然这个问题已经很久了,但我希望回答,因为它可能对其他人有所帮助。这可以通过JOINKEYS 在一个步骤中轻松完成。伪代码如下:

      • 编码JOINKEYS PAIRED(implicit) 并通过重新格式化归档获得这两个记录。如果任何一个文件都不匹配,则附加/前缀一些特殊字符,例如'$'
      • 通过 IFTHEN 比较 '$',如果存在则它没有配对记录,它将被写入未配对文件并保留到配对文件。

      如有任何问题,请务必回复。

      【讨论】:

      • 如果你只处理配对记录,你不会得到任何不匹配。如果 DFSORT 而不是 SyncSort,不需要'$',但可以使用内置匹配标记? (这就是匹配标记,这不是问题)。
      【解决方案4】:

      在 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                                                          
      /*                       
      

      【讨论】:

      • FILEC 将毫无用处,因为您不知道什么来自哪里。 TS/OP 应该被问到这个。回到 2009 年。不处理重复项。幸运的是,我们只说没有重复。您是否确保文件按密钥顺序排列?不?那就不行了该程序也可以用于可变长度记录。除了这些,这看起来还不错。
      【解决方案5】:
      //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                              
      /*                                              
      

      【讨论】:

      • 这根本不会得到任何匹配,只有 F1 的不匹配。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2021-06-15
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多