Замените ШЕСТНАДЦАТЕРИЧНОЕ значение другим шестнадцатеричным значением в наборе данных переменной длины с помощью SORT/ICEMAN

#sorting #mainframe #jcl

Вопрос:

У меня есть файл VB, в котором может быть шестнадцатеричное значение «0D25″ в любой позиции от 1 до 20 (значения из 21 позиции не должны изменяться). Это необходимо заменить шестнадцатеричным значением » 4040’.

Ввод:

 ---- ----1---- ----2---- ----3---- ----4---- 
0000/12345678  566  @(#)@0000/12345678  566  
FFFF6FFFFFFFF02FFF44B475BFFFF6FFFFFFFF02FFF02
0000112345678D5566005DBD50000112345678D5566D5
 

Ожидаемый результат:

 ---- ----1---- ----2---- ----3---- ----4---- 
0000/12345678  566  @(#)@0000/12345678  566  
FFFF6FFFFFFFF44FFF44B475BFFFF6FFFFFFFF02FFF02
000011234567800566005DBD50000112345678D5566D5
 

Я использовал СОРТИРОВКУ с контрольной картой ниже.

 SORT FIELDS=COPY                                     
OUTREC FIELDS=(1,4,5,20,CHANGE=(20,X'0D25',X'4040'), 
                        NOMATCH=(5,20),              
               21)           

                    
 

Ответ №1:

CHANGE= это работает не так, как вы думаете. Он выполняет поиск только в указанной позиции. Затем он заменяется либо заменяющим символом(символами), либо NOMATCH= символом(символами) точно такой длины, которая указана в качестве первого подпараметра CHANGE= (в вашем случае 20).

FINDREP= выполняет поиск указанного символа(ов) в каждой позиции и заменяет его заменяющим символом(символами). Вы ограничиваете часть записи , подлежащую проверке STARTPOS= , ENDPOS= ключевыми словами и, соответственно.

В вашем случае следующее утверждение должно делать то, что вы хотите:

 OUTREC FINDREP=(INOUT=(X'0D25',X'4040'),STARTPOS=5,ENDPOS=24)
 

Комментарии:

1. большое спасибо за помощь. Это сработало так, как мне нужно.