在PDS中搜索字符串,并使用JCL排除结果



我正在尝试执行以下操作:

1)pds搜索字符串的搜索成员。2)排除上述字符串的成员并获取成员列表。

我想使用JCL或任何其他大型机工具或实用程序进行此操作。

任何帮助都将不胜感激。

我认为您正在寻找iSPF搜索实用程序,也可以在批处理中执行。

您还可以在ISPF成员列表屏幕上使用SRCHFOR命令,然后按提示列进行排序,该列指示哪些成员具有匹配。

这样做可能有更好的方法,但这应该对您有用。复制以下JCL并替换:

  • 您的工作卡所需的任何东西
  • pds to-search 带有您要搜索的PD的名称
  • temp-pds-name 带有有效的PDS名称,该名称不会复制您已经拥有的任何内容
  • 字符串到搜索 - 带有您要搜索PDS成员的字符串

不包含字符串to-search-for 的PDS成员列表将在DD 列表中列出,您可以在适当的地方重定向。

第一个作业步骤(搜索)调用ISPF搜索实用程序,以确定所有包含字符串的PDS成员。第二步(LSTPDS)调用TSO Listds实用程序列出PDS的所有成员。第三步(REXXPGM)写一点REXX程序可用于下一步的临时PDS。最后一步(LSTMBR)运行REXX过程来构建列表数据集并删除沿途构建的临时文件。

如果一个人足够聪明,我认为冰et可以替换最后的两个步骤(但是到底...实际上我确实找到了一个更好的过程,请参阅下一个JCL)

//LOOKFOR JOB your-job-card-info
//*====================================================================
//SEARCH  EXEC PGM=ISRSUPC,PARM=(SRCHCMP,'ANYC')
//NEWDD  DD DSN=pds-to-search,DISP=SHR
//OUTDD DD DSN=&&SRCH,DISP=(NEW,PASS,DELETE),
//            AVGREC=K,
//            SPACE=(133,(5,5)),
//            DCB=(LRECL=133,BLKSIZE=133,RECFM=FB)
//SYSIN  DD *
SRCHFOR  'string-to-search-for'
/*
//*====================================================================
//LSTPDS   EXEC PGM=IKJEFT01
//SYSTSPRT DD DSN=&&MBRS,DISP=(NEW,PASS,DELETE),
//            AVGREC=K,
//            SPACE=(80,(5,5)),
//            DCB=(LRECL=80,BLKSIZE=80,RECFM=FB)
//SYSTSIN  DD *
 LISTDS 'pds-to-search' MEMBERS
/*
//REXXPDS  EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
 ALLOCATE DSN('temp-pds-name') NEW KEEP -
          DSORG(PO) RECFM(F,B) LRECL(80) -
          AVGREC(U) SPACE(80,100) DIR(5) DSNTYPE(PDS)
/*
//*====================================================================
//REXXPGM  EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
 REPRO INFILE(REXXPROG) OUTDATASET('temp-pds-name(MBRLIST)')
/*
//REXXPROG DD *
'EXECIO * DISKR SRCH(FINIS STEM X.'
FND = ''
DO I = 1 TO X.0
  IF WORD(X.I, 3) = 'STRING(S)' THEN FND = FND WORD(X.I, 1)
END
DROP X.
'EXECIO * DISKR MBRS(FINIS STEM X.'
MBRS = 0
DO I = 1 TO X.0 - 2
  IF MBRS & WORDPOS(WORD(X.I, 1), FND) = 0 THEN
     QUEUE WORD(X.I,1)
  ELSE
     IF X.I = '--MEMBERS--' THEN MBRS = 1 
END
'EXECIO * DISKW LISTING(FINIS'
RETURN
/*
//*====================================================================
//LISTMBR  EXEC PGM=IKJEFT01,PARM=('%MBRLIST')
//SYSEXEC  DD DSN=NXB123.JUNK,DISP=(OLD,DELETE,DELETE)
//SRCH     DD DSN=&&SRCH,DISP=(OLD,DELETE,DELETE)
//MBRS     DD DSN=&&MBRS,DISP=(OLD,DELETE,DELETE)
//LISTING  DD SYSOUT=A
//SYSTSPRT DD SYSOUT=A
//SYSTSIN  DD *
/*
//

这是一个更好的答案... 花了一段时间才能到达那里

//MYJOB JOB your-job-card-info
//SEARCH  EXEC PGM=ISRSUPC,PARM=(SRCHCMP,'LNFMTO')
//NEWDD  DD DSN=pds-to-search,DISP=SHR
//OUTDD DD DSN=&&SRCH,DISP=(NEW,PASS,DELETE),
//            AVGREC=K,
//            SPACE=(133,(5,5)),
//            DCB=(LRECL=133,BLKSIZE=133,RECFM=FB)
//SYSIN  DD *
 SRCHFOR  'string-to-search-for'
/*
//STEP02  EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTMSG DD SYSOUT=*
//SORTIN DD DSN=&&SRCH,DISP=(OLD,DELETE,DELETE)
//SORTOUT DD SYSOUT=*
//SYSIN DD *
 SORT FIELDS=COPY -
 INCLUDE COND=(30,6,CH,EQ,C'    0 ') -
 OUTREC  FIELDS=(1,8)
/*

关键是fed to ISRSUPC的LNFMTO参数。此参数告诉ISRSUPC仅列出这些成员找不到搜索字符串。到底是什么。下一步只是格式化上一步的结果。不包含搜索的成员列表字符串在SYSOUT中列出,可以在需要时重定向。

另一种方法:" punch"整个pds,按顺序不排序,将" flat"文件放在" flat"文件中;使用JoinKeys与使用SS准备的数据进行子弦,字段类型。

//PUNCHIT EXEC PGM=IEBPTPCH 
//SYSUT1 DD  DISP=SHR,DSN=your.pds 
//SYSUT2 DD  DSN=output.dataset,RECFM=FB,LRECL=81,otherstuffyouneed
//SYSPRINT DD SYSOUT=* 
//SYSIN DD * 
 PUNCH TYPORG=PO 
/*

之后,使用排序的Joinkeys步骤:

//FINDMISS EXEC PGM=SORT 
//SYSOUT   DD SYSOUT=* 
//SORTOUT  DD SYSOUT=* 
//SYSIN    DD * 
  OPTION COPY 
  JOINKEYS F1=INA,FIELDS=(1,8,A) 
  JOINKEYS F2=INB,FIELDS=(82,8,A) 
  JOIN UNPAIRED,F1,ONLY 
/*                                                             
//JNF1CNTL DD * 
  INCLUDE COND=(2,13,CH,EQ,C'MEMBER NAME') 
  INREC BUILD=(15,8)
/* 
//JNF2CNTL DD * 
  INCLUDE COND=(2,13,CH,EQ,C'MEMBER NAME', 
             OR,2,72,SS,EQ,C'yoursearchvalue') 
  INREC IFTHEN=(WHEN=GROUP,BEGIN=(2,13,CH,EQ,C'MEMBER NAME'),
                    PUSH=(82:15,8)), 
        IFTHEN=(WHEN=(2,13,CH,EQ,C'MEMBER NAME'), 
                    OVERLAY=(82:8X)) 
/*
//INA DD DISP=SHR,DSN=YOUR.PUNCHED.FILE 
//INB DD DISP=SHR,DSN=YOUR.PUNCHED.FILE (yes, exactly the same one)

然后处理打孔的文件,在同一步骤中读取两次,然后使用Joinkeys将文件从文件中"匹配"到文件中的另一个提取物。

在INA上通过JNF1CNTL提取所有成员名称。

在INB上通过JNF2CNTL提取所有成员名称,以及与所需搜索相匹配的所有数据线。ifthen =(当组= group时,然后用于标记与它们所属的成员名称匹配的每个数据行,并且会员名称本身将获得一个空白的成员名称。

然后,Joinkeys匹配会员名称键。所有不匹配的INA通过JNF1CNTL的人都是不包含搜索字符串的成员。两个文件都需要排序,默认情况下,每个Joinkeys语句。

这将与DFSort一起使用。使用Syncsort,将取决于您的安装是否支持JNFNCNTL文件(您必须尝试,未记录下来)。如果您没有JNFNCNTL支持,则需要两个较早的单独的步骤来提取数据。

最新更新