如何将前一记录中的字符串与当前记录中的字符串与MVS中的REXX进行比较?

时间:2016-04-13 12:52:44

标签: mainframe rexx

INPUT:

MEMBER:XPTO1
STEPALT2
MEMBER:XPTO2
MEMBER:XPTO3
STEPALT3STEPALT VERIFY
VERIFY2
MEMBER:XPTO4
VERIFY1 VERIFY02A01STEP

输出:

 MEMBER:XPTO1   STEPS:STEPALT2
 MEMBER:XPTO3   STEPS:STEPALT3 STEPALT  VERIFY  VERIFY2
 MEMBER:XPTO4   STEPS:VERIFY1  VERIFY02 A01STEP

OUTPUT2:

 MEMBER:XPTO1   STEPALT2
 MEMBER:XPTO3   STEPALT3 STEPALT    VERIFY  VERIFY2
 MEMBER:XPTO4   VERIFY1  VERIFY02 A01STEP

了解事实:每个成员名称或步骤名称最多可包含8个字符 我怎么能用REXX做到这一点?

1 个答案:

答案 0 :(得分:2)

这可能有用,它应该检测何时找到新成员。

IF SUBSTR(mydata,1,7) = "MEMBER:" THEN DO
  your code here to extract member data
END
ELSE DO
  your code to handle input that doesn't include a member
END

注意我没有办法运行并检查这个,所以请将其视为指南。 mydata也是输入数据的当前行

根据评论,我发现了一些Rexx。这里显示了用于处理输入数据的EXECIO和复合变量(请注意,这是为了输入数据而设计为批量运行//INPUT01 DD inputdataset,DISP=SHR。)

这是代码: -

 /* REXX - OPCDLYMN                                                    */0000100
 /*--------------------------------------------------------------------*/0001000
 /* OPC/ESA Log Monitor                                                */0002000
 /*--------------------------------------------------------------------*/0003000
 OPCDLYMN:                                                               0003100
    rec_count = 0                                                        0003200
    Do Forever                                                           0004000
       "EXECIO 1 DISKR INPUT01 (STEM In.)"                               0004100
       If rc ¬= 0 Then Leave                                             0004200
       rec_count = rec_count + 1                                         0004300
       If Substr(in.1,17,8) = "EQQE007I" Then Do                         0004400
          eqqe007i_typ = Substr(in.1,26,4)                               0004420
          eqqe007i_dly = Strip(Substr(in.1,83,9))                        0004430
          eqqe007i_day = Substr(in.1,2,2)                                0004440
          eqqe007i_mon = Substr(in.1,5,2)                                0004450
          eqqe007i_dat = eqqe007i_day"/"eqqe007i_mon                     0004460
          eqqe007i_tim = Substr(in.1,8,8)                                0004470
          eqqe007i_hr  = Substr(eqqe007i_tim,1,2)                        0004480
          eqqe007i_min = Substr(eqqe007i_tim,4,2)                        0004490
          eqqe007i_sec = Substr(eqqe007i_tim,7,2)                        0004500
          If eqqe007i_typ = "ALL " Then do                               0004520
             Say Right(eqqe007i_dly,9)" delays on "eqqe007i_dat||,       0004540
              " at "eqqe007i_tim                                         0004550
          End                                                            0004560
       End                                                               0004600
    End                                                                  0005000
    Say "End of processing "rec_count" records processed"                0006000

In。是STEM IN.1 是一个复合变量,基于词根。

注意你可以使用"EXECIO * DISKR INPUT01 (STEM in.)",它会读入所有数据(我认为In.0会保留计数而In.1,In.2 ...到nn (其中nn是,我认为,in.0持有的值))。但是,这可能(可能)导致内存问题。因此,为什么我通常会阅读各行。

注意If rc ¬= 0 Then Leave中= =(即¬)之前的字符并不总是可用(我认为主要是英国键盘)。相反,你可以使用/ =(NOT EQUALS)。

所以这个程序逐行读入所有数据,直到不再存在(rc由EXECIO设置为非零。如果有错误,如数据结束)。

rec_count递增,因此记录读取的记录数。

如果第17到第24个字符是EQQE007I,则进一步处理这些行,否则开始DO循环的另一次迭代。

当时进行的处理类似于提取输入线的各个部分。如果在字符26-29处存在ALL(具有以下空格),则通过Say输出信息(如果我没记错的话,则转到SYSOUT或SYSPRINT)。

如果您对此进行了调整,那么您可能需要复制当前行以便在下一次迭代中进行比较。

最后注意每行右边的7个数字不是代码的一部分。