使用JCL屏蔽中间数字

时间:2018-10-15 15:57:26

标签: dfsort

我有这样的要求。你能帮助任何一个帮助我吗?

我的输入文件中有16位数字的文件名。如果长度超过13位,则按原样显示前4位,按原样显示后4位,并屏蔽其余数字 如果少于13,则保持数字不变。

example
IP file

0000359681243354 
0000359681243354 
810176733 

OP

00003̶5̶9̶6̶8̶1̶2̶4̶3354 
00003̶5̶9̶6̶8̶1̶2̶4̶3354 
810176733

1 个答案:

答案 0 :(得分:0)

修改1: 根据此答案的“评论”部分中的@NicC的建议,您可以尝试以下代码:

  INREC IFTHEN=(WHEN=INIT,BUILD=(1,16)), 
        IFTHEN=(WHEN=(13,1,CH,NE,X'40',AND,13,1,CH,NE,X'00'),OVERLAY=(5:8C'-'))
  SORT FIELDS=COPY

或者,您也可以尝试以下代码。

首先,我们将OUTFILFTOV,VLTRIM=C' '一起使用,以使用RDW将输入记录转换为VB。这很有用,因为我们可以访问RDW来获取直到第一个非空白字符的数据长度。但是,如何访问RDW?。请参阅下一步。

第二,我们在T2文件中建立一个记录,其中包含实际数据,然后是数据的长度(RDW在1,2,BI中。从1,2,BI中减去4得到数据的长度)。

最后,使用INREC IFTHEN检查数据长度是否为GE 13。根据需要格式化数据。

注意: 需要更改DD名称,记录中16位数字长度字段的位置和其他输入字段的以下代码。

//STEP1 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG  DD SYSOUT=*
//IN DD DSN=...  input file (FB)
//TEMP1 DD DSN=&&TEMP1,UNIT=SYSDA,SPACE=(CYL,(5,5)),DISP=(,PASS)
//TEMP2 DD DSN=&&TEMP2,UNIT=SYSDA,SPACE=(CYL,(5,5)),DISP=(,PASS)
//OUT DD DSN=...  output file (FB)
//TOOLIN DD *
COPY FROM(IN) USING(CTL1)
COPY FROM(TEMP1) TO(TEMP2) USING(CTL2)
COPY FROM(TEMP2) TO(OUT) USING(CTL3)
/*
//CTL1CNTL DD *
  OUTFIL FNAMES=TEMP1,FTOV,VLTRIM=C' '
/*
//CTL2CNTL DD *
  OUTFIL FNAMES=TEMP2,VTOF,
    BUILD=(5,16,X,1,2,BI,SUB,+4,TO=ZD,LENGTH=2)
/*
//CTL3CNTL DD *
  INREC IFTHEN=(WHEN=(18,2,ZD,GE,13),BUILD=(1:1,4,5:8C'-',13:13,4),
        IFTHEN=(WHEN=(18,2,ZD,LT,13),BUILD=(1:1,6))
  SORT FIELDS=COPY