Сортировка jcl для разделения набора данных мэйнфреймов
Я пытаюсь разделить MF PS на несколько наборов данных. Например, если у меня есть набор данных, содержащий 600 записей, я хочу разделить его на 6 файлов по 100 записей в каждом. Можно ли сделать это с помощью сортировки JCL?
3 ответа
Приведенный ниже JCL использует DFSORT для равномерного разделения DD SOTRIN на 3 выходных DATASETS (OUT1,OUT2 и OUT3), чтобы сделать это на 6, добавить еще 3 выходных DD-оператора и добавить их в оператор FNAMES.
//SPLIT EXEC PGM=ICEMAN
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=Y897797.INPUT1,DISP=OLD
//OUT1 DD DSN=Y897797.SPLIT1,DISP=(NEW,CATLG),
// SPACE=(CYL,(5,5)),UNIT=SYSDA
//OUT2 DD DSN=Y897797.SPLIT2,DISP=(NEW,CATLG),
// SPACE=(CYL,(5,5)),UNIT=SYSDA
//OUT3 DD DSN=Y897797.SPLIT3,DISP=(NEW,CATLG),
// SPACE=(CYL,(5,5)),UNIT=SYSDA
//SYSIN DD *
SORT FIELDS=(21,5,FS,A)
OUTFIL FNAMES=(OUT1,OUT2,OUT3),SPLIT
/*
SORT FIELDS = (21,5, FS, A) - это то, как вы хотите отсортировать набор данных sortint, ниже приведено значение этого оператора полей
21 начало поля для сортировки
5 Длина поля для сортировки
FS плавающий знак (числовой знак)
Восходящий порядок
Руководство по началу работы с DFSORT
В Smart DFSORT Tricks есть много полезных примеров и пара других способов разделения записей из набора данных.
SPLIT - это просто SPLIT, вы не можете связать его с числом.
SPLITBY = n будет "вращать" n записей между каждым указанным набором данных OUTFIL. SPLIT такой же, как SPLITYBY = 1.
SPLIT1R = n будет выполнять только одно "вращение" (n записей будут записаны в первый набор данных OUTFIL, затем в n во второй OUTFIL и будут продолжаться до тех пор, пока не будет использован окончательный набор данных OUTFIL, который будет содержать все оставшиеся записи для ввода, нет независимо от того, сколько.
OUTFIL FILES = OUT1 не допускается.
ЕСЛИ используя STATREC/ENDREC или INCLUDE/OMIT, OUTFIL SAVE можно использовать для создания файла для записей, которые не записаны ни в один из других наборов данных OUTFIL.
- SORT CARD Deuian разделяет входной файл на выходной файл одинаково. Например, если у нас есть 3 выходных файла, общее количество входных записей, разделенное на 3, будет количеством записей каждого входного файла.
- Из cos мы можем указать количество, основанное на том, какое разделение должно произойти, как показано ниже. Его неявно разбивает входной файл на выходные файлы по 10000 записей каждый. Например, у нас есть 40000 записей во входном файле, и мы делим их на 3 выходных файла, тогда мы получим 10000+10000/3 записей в выходном файле.
OUTFIL FNAMES = (OUT1, OUT2, OUT3), SPLIT =10000
- В двух словах, мы можем использовать это, когда у нас нет никаких ограничений на количество выходных записей. Когда у нас есть какие-то такие критерии при разбиении, то фрагмент кода ниже помогает...
СОРТИРОВАТЬ ПОЛЯ = КОПИЯ
OUTFIL FILES = OUT1, ENDREC = 10000
OUTFIL FILES = 02, STARTREC = 10001, ENDREC = 20000 OUTFIL FILES = 03, STARTREC = 20001, ENDREC = 30000
- Наконец, если у нас есть более 30000 записей во входном файле, и мы не указали, что делать с этими записями, то SORT не будет беспокоиться о них. Это означает, что последний выходной файл будет содержать только 10000 записей.
Надеюсь, я дал вам понять. Вернитесь в случае вопроса дальше.
Предположим, вы не знаете, сколько записей находится в наборе данных, но хотите разделить записи как можно поровну между двумя наборами выходных данных. Вы можете использовать параметр SPLIT в OUTFIL, чтобы поместить первую запись в OUTPUT1, вторую запись в OUTPUT2, третью запись в OUTPUT1, четвертую запись в OUTPUT2 и так далее, пока у вас не закончатся записи. SPLIT разделяет записи по одной среди наборов данных, указанных FNAMES. Следующие операторы разделяют записи между двумя наборами данных OUTFIL: OPTION COPY OUTFIL FNAMES=(OUTPUT1,OUTPUT2),SPLIT С 17 входными записями результаты, полученные для OUTPUT1, следующие: Запись 01 Запись 03 Запись 05 Запись 07 Запись 09 Запись 11 Запись 13 Запись 15 Запись 17
Точно так же параметр SPLITBY=n OUTFIL разделяет записи n за раз среди наборов данных, указанных FNAMES. Следующие операторы разделяют записи по четыре между тремя наборами данных OUTFIL: OPTION COPY OUTFIL FNAMES=(OUT1,OUT2,OUT3),SPLITBY=4