FINDREP 一个较长的短字符串,不会覆盖下一列
FINDREP a short string with longer without overwriting next column
所以我有这样一组数据:
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
*
您面临的问题是,如果 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.
只需在您的排序卡中做一点小改动 - SHIFT=NO
所以我有这样一组数据:
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
*
您面临的问题是,如果 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.
只需在您的排序卡中做一点小改动 - SHIFT=NO