我有这样的要求。你能帮助任何一个帮助我吗?
我的输入文件中有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
答案 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
或者,您也可以尝试以下代码。
首先,我们将OUTFIL
与FTOV,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