замаскировать среднее число с помощью JCL - PullRequest
0 голосов
/ 15 октября 2018

У меня есть такой запрос.Не могли бы вы помочь кому-нибудь помочь мне?

У меня есть файл длиной 16 цифр во входном файле.если длина больше 13 цифр, то первые 4 цифры как есть и последние 4 цифры как есть и маскируют оставшееся число, если меньше 13, то оставьте номер как есть.

example
IP file

0000359681243354 
0000359681243354 
810176733 

OP

00003̶5̶9̶6̶8̶1̶2̶4̶3354 
00003̶5̶9̶6̶8̶1̶2̶4̶3354 
810176733

1 Ответ

0 голосов
/ 19 октября 2018

Изменить 1: В соответствии с предложениями @ NicC в разделе «Комментарии» этого ответа вы можете попробовать следующий код:

  INREC IFTHEN=(WHEN=INIT,BUILD=(1,16)), 
        IFTHEN=(WHEN=(13,1,CH,NE,X'40',AND,13,1,CH,NE,X'00'),OVERLAY=(5:8C'-'))
  SORT FIELDS=COPY

В качестве альтернативы, вытакже можете попробовать следующий код.

Во-первых, мы используем OUTFIL с FTOV,VLTRIM=C' ' для преобразования входных записей в VB с RDW.Это полезно, потому что мы можем получить доступ к RDW, чтобы получить длину данных до первого непустого символа.Но, как получить доступ к RDW? См. Следующий шаг.

Во-вторых, мы строим запись в файле T2 с фактическими данными, за которыми следует длина данных (RDW находится в 1,2,BI. Вычтите 4 из 1,2,BI, чтобы получить длину данных).

Наконец, используйте INREC IFTHEN, чтобы проверить, равна ли длина данных GE 13 или нет.Отформатируйте данные как требуется.

Примечание: Следующий код необходимо изменить для имен DD, положения поля длиной 16 цифр и других полей ввода в записи.

//STEP1 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG  DD SYSOUT=*
//IN DD DSN=...  input file (FB)
//TEMP1 DD DSN=&&TEMP1,UNIT=SYSDA,SPACE=(CYL,(5,5)),DISP=(,PASS)
//TEMP2 DD DSN=&&TEMP2,UNIT=SYSDA,SPACE=(CYL,(5,5)),DISP=(,PASS)
//OUT DD DSN=...  output file (FB)
//TOOLIN DD *
COPY FROM(IN) USING(CTL1)
COPY FROM(TEMP1) TO(TEMP2) USING(CTL2)
COPY FROM(TEMP2) TO(OUT) USING(CTL3)
/*
//CTL1CNTL DD *
  OUTFIL FNAMES=TEMP1,FTOV,VLTRIM=C' '
/*
//CTL2CNTL DD *
  OUTFIL FNAMES=TEMP2,VTOF,
    BUILD=(5,16,X,1,2,BI,SUB,+4,TO=ZD,LENGTH=2)
/*
//CTL3CNTL DD *
  INREC IFTHEN=(WHEN=(18,2,ZD,GE,13),BUILD=(1:1,4,5:8C'-',13:13,4),
        IFTHEN=(WHEN=(18,2,ZD,LT,13),BUILD=(1:1,6))
  SORT FIELDS=COPY
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...