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

5 mainframe syncsort easytrieve dfsort

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

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

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

Bil*_*ger 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    
Run Code Online (Sandbox Code Playgroud)

"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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

一些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
Run Code Online (Sandbox Code Playgroud)

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

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

 REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100,?)
Run Code Online (Sandbox Code Playgroud)

这会将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'$'
Run Code Online (Sandbox Code Playgroud)

如果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))
Run Code Online (Sandbox Code Playgroud)

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))
Run Code Online (Sandbox Code Playgroud)

SyncSort的编码也适用于DFSORT.

获得匹配的记录很容易.

  OUTFIL FNAMES=MATCH,SAVE
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)


小智 0

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

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

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