2015-07-13 5 views
1

Так у меня есть набор данных, таких, как это:FINDREP короткая строка больше не переписывая следующий столбец

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             
*   

ответ

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.