REXX/SORT 拆分顺序文件
REXX/SORT split sequential file
我需要拆分顺序大型机文件。好吧,准确地说,我需要从一个特定的关键字开始,将内容从这个文件复制到另一个文件。示例:
line1
line2
line3
start line4
line5
line6
在这种情况下,我需要搜索 "start" 并使用 REXX 或 SORT 将第 4 行开始的所有内容复制到另一个文件。有什么建议么?
编辑:我在 REXX 中想到但不满意的地方
"EXECIO * DISKR INPUT (STEM INPUT. FINIS)"
LINEINPUT = 1
LINEOUTPUT = 1
FOUND = 0 /*working like a boolean?
DO WHILE LINEINPUT <= INPUT.0
IF INPUT.LINEINPUT = start line4 THEN DO
FOUND = 1
END
IF FOUND = 1 THEN DO
INPUT.LINEINPUT = OUTPUT.LINEOUTPUT
LINEOUTPUT = LINEOUTPUT + 1
END
LINEINPUT = LINEINPUT + 1
END
可能是这样,但这意味着我需要逐行查看所有这些文件。也许在 JCL 中有更好的方法?也许 Syncsort 可以做这样的事情?
RECFM 已修复。准确地说是亚马逊物流。 LRECL 170. 触发器可以是该行的一部分,也可以是整行。这并不重要,因为它在每个文件中始终是同一行,甚至前几个字符在整个文件中都是唯一的。表示 "start" 在文件中只出现一次。
抱歉没有发表评论,因为我没有足够的声誉,我正在写这篇回答。稍后将删除它
您可以通过两种方法实现此目的,即通过 REXX 或 JCL。
请向我们展示您到目前为止所做的尝试,以便我们找出需要改进的地方。
对于触发器的固定位置启动:
OPTION COPY
INREC IFTHEN=(WHEN=GROUP,
BEGIN=(1,5,CH,EQ,C'start'),
PUSH=(171:ID=1))
OUTFIL OMIT=(171,1,CH,EQ,C' '),
BUILD=(1,170)
对于可变位置、唯一、触发器:
OPTION COPY
INREC IFTHEN=(WHEN=GROUP,
BEGIN=(1,170,SS,EQ,C'start'),
PUSH=(171:ID=1))
OUTFIL OMIT=(171,1,CH,EQ,C' '),
BUILD=(1,170)
WHEN=GROUP
给你 PUSH
,它将把来自当前记录的数据,或一个组号(ID
)或组内的号(SEQ
) , 到组中所有记录(包括当前记录)的那个位置。在这种情况下,"group" 是文件的其余部分。
SS
是允许子字符串搜索的字段类型。
然后 OMIT=
(类似于 OMIT COND=
,但在文件已被控制卡处理后)在 OUTFIL
上从标志(自动扩展记录)中进行实际选择不具有来自 PUSH 的值将被设置为空白)和 BUILD 以丢弃额外的字节。
需要额外的字节,因为 SORT 没有 "program storage" 定义 - 额外的字段必须在记录中(或者,仅在当前记录的持续时间内,在 PARSEd 字段中)。
我需要拆分顺序大型机文件。好吧,准确地说,我需要从一个特定的关键字开始,将内容从这个文件复制到另一个文件。示例:
line1
line2
line3
start line4
line5
line6
在这种情况下,我需要搜索 "start" 并使用 REXX 或 SORT 将第 4 行开始的所有内容复制到另一个文件。有什么建议么?
编辑:我在 REXX 中想到但不满意的地方
"EXECIO * DISKR INPUT (STEM INPUT. FINIS)"
LINEINPUT = 1
LINEOUTPUT = 1
FOUND = 0 /*working like a boolean?
DO WHILE LINEINPUT <= INPUT.0
IF INPUT.LINEINPUT = start line4 THEN DO
FOUND = 1
END
IF FOUND = 1 THEN DO
INPUT.LINEINPUT = OUTPUT.LINEOUTPUT
LINEOUTPUT = LINEOUTPUT + 1
END
LINEINPUT = LINEINPUT + 1
END
可能是这样,但这意味着我需要逐行查看所有这些文件。也许在 JCL 中有更好的方法?也许 Syncsort 可以做这样的事情?
RECFM 已修复。准确地说是亚马逊物流。 LRECL 170. 触发器可以是该行的一部分,也可以是整行。这并不重要,因为它在每个文件中始终是同一行,甚至前几个字符在整个文件中都是唯一的。表示 "start" 在文件中只出现一次。
抱歉没有发表评论,因为我没有足够的声誉,我正在写这篇回答。稍后将删除它
您可以通过两种方法实现此目的,即通过 REXX 或 JCL。 请向我们展示您到目前为止所做的尝试,以便我们找出需要改进的地方。
对于触发器的固定位置启动:
OPTION COPY
INREC IFTHEN=(WHEN=GROUP,
BEGIN=(1,5,CH,EQ,C'start'),
PUSH=(171:ID=1))
OUTFIL OMIT=(171,1,CH,EQ,C' '),
BUILD=(1,170)
对于可变位置、唯一、触发器:
OPTION COPY
INREC IFTHEN=(WHEN=GROUP,
BEGIN=(1,170,SS,EQ,C'start'),
PUSH=(171:ID=1))
OUTFIL OMIT=(171,1,CH,EQ,C' '),
BUILD=(1,170)
WHEN=GROUP
给你 PUSH
,它将把来自当前记录的数据,或一个组号(ID
)或组内的号(SEQ
) , 到组中所有记录(包括当前记录)的那个位置。在这种情况下,"group" 是文件的其余部分。
SS
是允许子字符串搜索的字段类型。
然后 OMIT=
(类似于 OMIT COND=
,但在文件已被控制卡处理后)在 OUTFIL
上从标志(自动扩展记录)中进行实际选择不具有来自 PUSH 的值将被设置为空白)和 BUILD 以丢弃额外的字节。
需要额外的字节,因为 SORT 没有 "program storage" 定义 - 额外的字段必须在记录中(或者,仅在当前记录的持续时间内,在 PARSEd 字段中)。