Вопрос или проблема
Привет, у меня есть следующий код и данные, из которых я пытаюсь извлечь 3 поля, которые могут быть или не быть, и они не находятся в фиксированных позициях: Я смотрел в интернете, и на многих форумах говорится, что нужно использовать команду IFTHEN(WHEN=INIT), но это не работает для меня – он находит первое поле, но больше ничего после этого – есть идеи, пожалуйста.
JCL:
//STEP010 EXEC PGM=ICEMAN
//SORTIN DD DISP=SHR,DSN=TTFO.PQUQ.NPDARCH.PRPY.D24032.V2
//SORTOUT DD DSN=TTFO.WARREPB.PPAY.ARCH.FUND.Y2024.QMU.&MTH,
// DISP=(NEW,CATLG),UNIT=DASD,SPACE=(TRK,(600,
// 150),RLSE),RECFM=VB,LRECL=400
//SYSOUT DD SYSOUT=*
//SYSIN DD *
OPTION VLSCMP
INCLUDE COND=((2363,1,CH,NE,C'Y'),
AND,((1,25000,SS,NE,C';0378; '),
OR,(1,25000,SS,NE,C';0379; ')))
INREC IFTHEN=(WHEN=INIT,
PARSE=(%01=(ABSPOS=1,STARTAT=C';0118;',ENDBEFR=C';0119;',
FIXLEN=40))),
IFTHEN=(WHEN=INIT,
PARSE=(%02=(ABSPOS=1,STARTAT=C';0004;',ENDBEFR=C';0005;',
FIXLEN=35))),
IFTHEN=(WHEN=INIT,
PARSE=(%03=(ABSPOS=1,STARTAFT=C';0378;',ENDBEFR=C';',
FIXLEN=4))),
IFTHEN=(WHEN=NONE,
BUILD=(1:1,4,
%01,C'*', %02,C'&',C' 378 ', %03,C'£'))
SORT FIELDS=COPY
/*
//
Входной файл – TTFO.PQUQ.NPDARCH.PRPY.D24032.V2 :
NWBDM2I78742122 PROPAY 2024-02-01……….GBPUBNINPI02584368;0117;E;**0118;2024-02-01;0119;**9999-12-31;0120;SHA;0121;N;0122; ;0377;N;0378; ;0379;CODEWORD /RETN/ RECEIVED GO TO PAGE 4 ;0380;/RETN/ ;0381;N;0382;2433;0383;Тот же номер счета, используемый для кредита и дебета
Файл вывода – TTFO.WARREPB.PPAY.ARCH.FUND.Y2024.QMU.ALL :
;0118;2024-02-01 * £
Поле 0118 найдено, но ни одно из остальных.
Если я поменяю их местами, чтобы он сначала искал поле 0378, он находит его, но ни одно из остальных. Похоже, что он не разбирает после первого успешного разбора.
Большое спасибо
Ответ или решение
Ваш вопрос касается использования DFSORT и команды PARSE для извлечения нефиксированных полей из строки данных, что может быть довольно сложной задачей. Давайте подробно разберем вашу ситуацию и предложим подходящее решение.
Проблема
Вы пытаетесь извлечь три поля, которые могут отсутствовать и находятся в переменных позициях. Ваша текущая реализация включается в логику IFTHEN(WHEN=INIT)
, что не позволяет успешно извлекать более одного поля, если первое поле найдено. Проблема заключается в том, что DFSORT обрабатывает команды последовательно и не продолжает операции парсинга после первого успешного выполнения.
Решение
Для корректного извлечения нескольких необязательных полей лучше использовать комбинацию IFTHEN(WHEN=INIT)
и IFTHEN(WHEN=NONE)
с раздельной логикой для каждого поля.
Пример переработанного кода
Вот предложенная версия вашего JCL, которая может помочь извлечь нужные поля:
//STEP010 EXEC PGM=ICEMAN
//SORTIN DD DISP=SHR,DSN=TTFO.PQUQ.NPDARCH.PRPY.D24032.V2
//SORTOUT DD DSN=TTFO.WARREPB.PPAY.ARCH.FUND.Y2024.QMU.&MTH,
// DISP=(NEW,CATLG),UNIT=DASD,SPACE=(TRK,(600,
// 150),RLSE),RECFM=VB,LRECL=400
//SYSOUT DD SYSOUT=*
//SYSIN DD *
OPTION VLSCMP
INCLUDE COND=((2363,1,CH,NE,C'Y'),
AND,((1,25000,SS,NE,C';0378; '),
OR,(1,25000,SS,NE,C';0379; ')))
INREC IFTHEN=(WHEN=INIT,
PARSE=(%01=(ABSPOS=1,STARTAT=C';0118;',ENDBEFR=C';0119;',
FIXLEN=40))),
IFTHEN=(WHEN=NONE,
PARSE=(%02=(ABSPOS=1,STARTAT=C';0004;',ENDBEFR=C';0005;',
FIXLEN=35))),
IFTHEN=(WHEN=NONE,
PARSE=(%03=(ABSPOS=1,STARTAFT=C';0378;',ENDBEFR=C';',
FIXLEN=4))),
IFTHEN=(WHEN=NONE,
BUILD=(1:1,4,
%01,C'*', %02,C'&', %03,C' 378 ',C'£'))
SORT FIELDS=COPY
/*
Основные изменения
-
Используйте
WHEN=NONE
для последовательного поиска: Убедитесь, что каждое последующее поле ищется с использованиемWHEN=NONE
, чтобы возможности парсинга не прерывались до тех пор, пока не завершено извлечение всех полей. -
Создание логики сборки: Слог до команд
BUILD
должен происходить только после того, как вы проверили наличие каждого из полей, которые вы хотите собрать для выходных данных. -
Отладка и тестирование: Проведите тестирование с различными наборами данных, чтобы убедиться, что корректно извлекаются значения, даже если некоторые поля отсутствуют.
Заключение
С помощью предложенной логики можно успешно решить проблему извлечения переменных и необязательных полей из строк данных. Убедитесь, что логика проверки полей и последующей сборки данных правильно реализована, что позволяет избежать прерывания процессов извлечения при успешном нахождении полей.
SEO-оптимизация
Ключевые фразы: DFSORT, PARSE, необязательные поля, переменные позиции, JCL, обработка данных в сортировке. Эти метки помогут вашему вопросу или решению быть найденным пользователями, сталкивающимися с аналогичными проблемами.