我有这样的要求。 你能帮帮任何人帮我吗?
我的输入文件中有 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:根据@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