Добавить данные в конце существующих данных с помощью SORT
Я хочу, чтобы приведенный ниже код работал для данных переменной длины также при вводе. Так что я могу добавить двойную кавычку в конце. Я не хочу использовать КОБОЛ. Является ли это возможным?
ZZZZ.VVVV.FILE.CORR1 содержит следующие записи:-
ABCDEFG_AAAAAA_BBB0001.csv ABCDEFG_AAAAAA_BBB0002.csv ABCDEFG_AAAAAA_BBB0003.csv
Вывести записи в файл ZZZZ.VVVV.FILE.CORR2 с помощью следующего кода:
r_file1="ABCDEFG_AAAAAA_BBB0001.csv" r_file2="ABCDEFG_AAAAAA_BBB0002.csv" r_file3="ABCDEFG_AAAAAA_BBB0003.csv"
Код JCL:
//STEPSRT5 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=ZZZZ.VVVV.FILE.CORR1, <ID>
// DISP=SHR
//SORTOUT DD DSN=ZZZZ.VVVV.FILE.CORR2, <OD>
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=0),
// SPACE=(27920,(29,6),RLSE),
// DISP=(NEW,CATLG,DELETE)
//SYSIN DD *
SORT FIELDS=COPY
OUTREC FIELDS=(1:C'r_file',7:SEQNUM,1,ZD,8:C'="',10:1,26,36:C'"',44X)
/*
2 ответа
SORT FIELDS=COPY
INREC BUILD=(C'r_file',SEQNUM,1,ZD,C'="',5,44,80:X)
OUTREC FINDREP=(STARTPOS=14,IN=C' ',OUT=C'"',DO=1)
Кстати, это не JCL, это контрольные карты SORT. Вы найдете все подробности в руководстве для продукта SORT вашего сайта.
INREC / OUTREC / OUTFIL может содержать только один вариант: BUILD, OVERLAY, IFTHEN или один или несколько IFTHEN. Два способа сделать это, так как вы хотите, чтобы две функции использовались безоговорочно, аналогичны приведенным выше, или с двумя IFTHEN=(WHEN=NONE с частью использования функции IFTHEN.
Ваши записи не являются переменными. Они имеют фиксированную длину (или ваш существующий код не будет работать), вероятно, 80 байтов (если не 80, измените 80:X соответственно).
Имейте в виду, что вы получите повторяющиеся порядковые номера с более чем 10 входными записями (а десятая даст вам r_file0).
Вы также можете посмотреть на SQZ (сжатие), так как у вас нет встроенных пробелов в ваших данных.
Попробуйте следующее:
//STEP01 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
INREC BUILD=(C'r_file',SEQNUM,3,CSF,C'="',1,68,C'"')
OUTREC BUILD=(1,80,SQZ=(SHIFT=LEFT))
/*
//SORTIN DD *
ABCDEFG_AAAAAA_BBB0001.csv
ABCDEFG_AAAAAA_BBB0002.csv
ABCDEFG_AAAAAA_BBB0003.csv
ABCDEFG_AAAAAA_0702.csv
ABCDEFG_AAAAAA_AAAYZ0702.csv
ABCDEFG_AAAAAA_BBB.csv
ABCDEFG_AAAAAA_XXXXXXXAMY0702.csv
ABCDEFG_AAAAAA_YZ0702.csv
ABCDEFG_AAAAAA_C0702.csv
ABCDEFG_AAAAAA_0702.csv
ABCDEFG_AAAAAA_702.csv
ABCDEFG_AAAAAA_02.csv
ABCDEFG_AAAAAA_2.csv
/*
//SORTMSG DD SYSOUT=*
//
SORTOUT будет содержать:
r_file1="ABCDEFG_AAAAAA_BBB0001.csv"
r_file2="ABCDEFG_AAAAAA_BBB0002.csv"
r_file3="ABCDEFG_AAAAAA_BBB0003.csv"
r_file4="ABCDEFG_AAAAAA_0702.csv"
r_file5="ABCDEFG_AAAAAA_AAAYZ0702.csv"
r_file6="ABCDEFG_AAAAAA_BBB.csv"
r_file7="ABCDEFG_AAAAAA_XXXXXXXAMY0702.csv"
r_file8="ABCDEFG_AAAAAA_YZ0702.csv"
r_file9="ABCDEFG_AAAAAA_C0702.csv"
r_file10="ABCDEFG_AAAAAA_0702.csv"
r_file11="ABCDEFG_AAAAAA_702.csv"
r_file12="ABCDEFG_AAAAAA_02.csv"
r_file13="ABCDEFG_AAAAAA_2.csv"
INREC
создает запись что-то вроде:
r_file 10="ABCDEFG_AAAAAA_0702.csv "
Хитрость заключается в использовании CFS
для порядкового номера, чтобы они были созданы с ведущими пробелами, таким образом, мы не запутались, пытаясь обрезать начальные нули, как это требуется с ZD
(SQZ
с PREBLANK=C'0'
избавиться от ведущих нулей просто не работает - он избавляется от всех нулей, включая пропущенные и конечные)
следующий OUTREC
сжимает пробелы из записи, оставляя имя файла так, как вам требуется.
Примечание. Это решение предполагает, что имена ваших файлов не содержат встроенных пробелов. Если они это сделают, еще многое предстоит сделать.