1

所以我有一组数据,例如:

mxyzd1    0000015000
mxyzd2    0000016000 
xyzmd5823 0000017000

我需要使用 dfsort 来获取这些数据:

123xyzd1  0000015000
123xyzd2  0000016000 
xyz123d5820000017000

所以我的意思是:将所有字符 'm' 替换为 '123' 而不会覆盖第二列,因此在到达第二列(从 pos 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                                                 
*        
4

2 回答 2

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。

于 2015-07-13T12:56:57.893 回答
0

只需在您的分类卡上做一点小改动 - SHIFT=NO

于 2021-11-03T03:03:43.787 回答