gpt4 book ai didi

mainframe - 比较两个文件并将其写入 "match"和 "nomatch"文件

转载 作者:行者123 更新时间:2023-12-04 17:59:52 31 4
gpt4 key购买 nike

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

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

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

最佳答案

由于 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 上的每个字段都定义有开始位置和长度。

然后由 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))

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)

同步排序
  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)

关于mainframe - 比较两个文件并将其写入 "match"和 "nomatch"文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/792432/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com