REXX/SORT разделить последовательный файл
Мне нужно разделить последовательный файл мэйнфрейма. Ну, если быть точным, мне нужно скопировать содержимое этого файла в другой, начиная с определенного ключевого слова. Пример:
line1
line2
line3
start line4
line5
line6
В этом случае мне нужно найти "start" и скопировать все, начиная с строки 4, в другой файл, используя REXX или SORT. Какие-либо предложения?
РЕДАКТИРОВАТЬ: То, что я думал, но не доволен в REXX
"EXECIO * DISKR INPUT (STEM INPUT. FINIS)"
LINEINPUT = 1
LINEOUTPUT = 1
FOUND = 0 /*working like a boolean?
DO WHILE LINEINPUT <= INPUT.0
IF INPUT.LINEINPUT = start line4 THEN DO
FOUND = 1
END
IF FOUND = 1 THEN DO
INPUT.LINEINPUT = OUTPUT.LINEOUTPUT
LINEOUTPUT = LINEOUTPUT + 1
END
LINEINPUT = LINEINPUT + 1
END
Может быть, что-то вроде этого, но это означает, что мне нужно построчно просматривать все эти файлы. Может быть, есть лучший способ в JCL? Может быть, Syncsort может сделать что-то подобное?
RECFM исправлен. FBA, чтобы быть точным. LRECL 170. Триггер может быть частью этой строки или всей строки. Это не важно, потому что это всегда одна и та же строка в каждом отдельном файле, и даже первые несколько символов уникальны во всем файле. Означает, что "запуск" появляется только один раз в файле.
2 ответа
Для запуска триггера с фиксированной позиции:
OPTION COPY
INREC IFTHEN=(WHEN=GROUP,
BEGIN=(1,5,CH,EQ,C'start'),
PUSH=(171:ID=1))
OUTFIL OMIT=(171,1,CH,EQ,C' '),
BUILD=(1,170)
Для переменной с уникальным положением, триггер:
OPTION COPY
INREC IFTHEN=(WHEN=GROUP,
BEGIN=(1,170,SS,EQ,C'start'),
PUSH=(171:ID=1))
OUTFIL OMIT=(171,1,CH,EQ,C' '),
BUILD=(1,170)
WHEN=GROUP
дает тебе PUSH
, в который будут помещены данные из текущей записи или номер группы (ID
) или номер в группе (SEQ
), на эту позицию на всех записях в группе (включая текущую запись). В этом случае "группа" является остальной частью файла.
SS
является типом поля, разрешающим поиск подстроки.
Тогда OMIT=
(похожий на OMIT COND=
но после того, как файл был обработан контрольными карточками) на OUTFIL
делает фактический выбор из флага (автоматически расширенные записи, не имеющие значения из PUSH, будут установлены как пустые) и BUILD, чтобы сбросить дополнительный байт.
Дополнительный байт необходим, потому что в SORT нет "программного хранилища" для определений - дополнительные поля должны быть в записях (или, только для текущей записи, в полях PARSEd).
Извините, что не комментирую, так как у меня недостаточно репутации, я пишу это в ответ. Уберу это позже
Вы можете достичь этого обоими способами, то есть через REXX или JCL. Пожалуйста, покажите нам, что вы пробовали до сих пор, чтобы мы могли выяснить, что улучшить.