所以我有一组这样的数据:
mxyzd1 0000015000
mxyzd2 0000016000
xyzmd5823 0000017000
我需要使用dfsort来获取这些数据:
123xyzd1 0000015000
123xyzd2 0000016000
xyz123d5820000017000
所以我的意思是:替换所有角色' m'由' 123'不覆盖第二列,所以在到达第二列(从第11位开始)之前截断数据。
到目前为止,我已经能够替换数据,但无法阻止我的所有数据移位,这是我的代码到目前为止:
SYSIN DATA *
SORT FIELDS=(1,1,CH,A)
OUTREC FINDREP=(IN=C'm',OUT=C'123',STARTPOS=1,ENDPOS=10,
MAXLEN=20,OVERRUN=TRUNC,SHIFT=YES)
DATAEND
*
答案 0 :(得分:2)
您面临的问题是,如果FINDREP更改增加长度,记录中的所有数据将向右移动,如果FINDREP更改减少长度,则向左移动。更改的数据的长度的任何更改都会影响整个记录。你自己发现了这个。
换句话说,FINDREP不知道字段(列最好被称为类似的东西)它只知道记录,即使它只查看记录的一部分,长度的变化反映在其余部分记录。
没有办法只写一个FINDREP来避免这种情况。
OPTION COPY
INREC IFTHEN=(WHEN=INIT,
OVERLAY=(21:1,10)),
IFTHEN=(WHEN=INIT,
FINDREP=(IN=C'm',
OUT=C'123',
STARTPOS=21)),
IFTHEN=(WHEN=INIT,
BUILD=(21,10,
11,10))
这会将1,10中的数据放入记录的临时扩展名中。它只会在临时扩展上执行FINDREP。然后它将占用扩展的前10个字节并将它们放入位置1,长度为10。