Поскольку 12 200 человек посмотрели на этот вопрос и не получили ответа:
DFSORT и SyncSort являются преобладающими продуктами сортировки для мейнфреймов. Их контрольные карты имеют много общего и некоторые различия.
JOINKEYS FILE=F1,FIELDS=(key1startpos,7,A)
JOINKEYS FILE=F2,FIELDS=(key2startpos,7,A)
JOIN UNPAIRED,F1,F2
REFORMAT FIELDS=(F1:1,5200,F2:1,5200)
SORT FIELDS=COPY
«JOINKEYS» состоит из трех задач. Подзадача 1 — это первый JOINKEYS. Подзадача 2 — это второй JOINKEYS. Далее следует основная задача, в которой обрабатываются объединенные данные. В приведенном выше примере это простая операция COPY. Объединенные данные будут просто записаны в SORTOUT.
Оператор JOIN определяет, что основной задаче должны быть представлены непарные записи F1 и F2, а также совпадающие записи.
Оператор REFORMAT определяет запись, которая будет представлена основной задаче. Более эффективный пример, предполагающий, что от F2 требуются три поля:
REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100)
Каждое из полей на F2 определяется начальной позицией и длиной.
Запись, которая затем обрабатывается основной задачей, имеет длину 5311 байт, а на поля из F2 можно ссылаться с помощью 5201,10,5211,1,5212,100, а запись F1 равна 1,5200.
Лучший способ добиться того же — уменьшить размер F2 с помощью JNF2CNTL.
//JNF2CNTL DD *
INREC BUILD=(207,1,10,30,1,5100,100)
Некоторые установки SyncSort не поддерживают JNF2CNTL, и даже там, где он поддерживается (начиная с Syncsort MFX для z/OS версии 1.4.1.0 и выше), он не задокументирован SyncSort. Для пользователей 1.3.2 или 1.4.0 доступно обновление от SyncSort, обеспечивающее поддержку JNFnCNTL.
Следует отметить, что JOINKEYS по умолчанию сортирует данные с опцией EQUALS. Если данные для файла JOINKEYS уже находятся в определенной последовательности, следует указать SORTED. Для DFSORT также можно указать NOSEQCHK, если проверка последовательности не требуется.
JOINKEYS FILE=F1,FIELDS=(key1startpos,7,A),SORTED,NOSEQCHK
Хотя запрос странный, так как исходный файл определить не удастся, все несопоставленные записи должны попасть в отдельный выходной файл.
С DFSORT есть маркер соответствия, указанный с помощью ? в РЕФОРМАТЕ:
REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100,?)
Это увеличивает длину записи REFORMAT на один байт. ? может быть указан в любом месте записи REFORMAT, и указывать его не нужно. ? разрешается DFSORT в: B, данные получены из обоих файлов; 1, непревзойденный рекорд F1; 2, непревзойденный рекорд от F2.
SyncSort не имеет маркера совпадения. Отсутствие или наличие данных в записи REFORMAT должно определяться значениями. Выберите байт в обеих входных записях, который не может содержать определенное значение (например, в числе выберите нечисловое значение). Затем укажите это значение как символ FILL в REFORMAT.
REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100),FILL=C'$'
Если позиция 1 на F1 не может, естественно, иметь «$», а позиция 20 на F2 тоже не может, то эти две позиции можно использовать для определения результата матча. При необходимости можно протестировать всю запись, но это отнимает больше процессорного времени.
Очевидное требование состоит в том, чтобы все несопоставленные записи из F1 или F2 записывались в один файл. Для этого потребуется оператор REFORMAT, который включает обе записи целиком:
DFSORT, вывод несовпадающих записей:
REFORMAT FIELDS=(F1:1,5200,F2:1,5200,?)
OUTFIL FNAMES=NOMATCH,INCLUDE=(10401,1,SS,EQ,C'1,2'),
IFTHEN=(WHEN=(10401,1,CH,EQ,C'1'),
BUILD=(1,5200)),
IFTHEN=(WHEN=NONE,
BUILD=(5201,5200))
SyncSort, вывод несовпадающих записей:
REFORMAT FIELDS=(F1:1,5200,F2:1,5200),FILL=C'$'
OUTFIL FNAMES=NOMATCH,INCLUDE=(1,1,CH,EQ,C'$',
OR,5220,1,CH,EQ,C'$'),
IFTHEN=(WHEN=(1,1,CH,EQ,C'$'),
BUILD=(1,5200)),
IFTHEN=(WHEN=NONE,
BUILD=(5201,5200))
Код для SyncSort также будет работать с DFSORT.
Записать совпадающие записи легко.
OUTFIL FNAMES=MATCH,SAVE
SAVE гарантирует, что все записи, не записанные другим OUTFIL, будут записаны здесь.
Требуется некоторое переформатирование, чтобы в основном выводить данные из F1, но выбирать некоторые поля из F2. Это будет работать как для DFSORT, так и для SyncSort:
OUTFIL FNAMES=MATCH,SAVE,
BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929)
Все это с произвольным началом и длиной:
DFSORT
JOINKEYS FILE=F1,FIELDS=(1,7,A)
JOINKEYS FILE=F2,FIELDS=(20,7,A)
JOIN UNPAIRED,F1,F2
REFORMAT FIELDS=(F1:1,5200,F2:1,5200,?)
SORT FIELDS=COPY
OUTFIL FNAMES=NOMATCH,INCLUDE=(10401,1,SS,EQ,C'1,2'),
IFTHEN=(WHEN=(10401,1,CH,EQ,C'1'),
BUILD=(1,5200)),
IFTHEN=(WHEN=NONE,
BUILD=(5201,5200))
OUTFIL FNAMES=MATCH,SAVE,
BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929)
Синхронная сортировка
JOINKEYS FILE=F1,FIELDS=(1,7,A)
JOINKEYS FILE=F2,FIELDS=(20,7,A)
JOIN UNPAIRED,F1,F2
REFORMAT FIELDS=(F1:1,5200,F2:1,5200),FILL=C'$'
SORT FIELDS=COPY
OUTFIL FNAMES=NOMATCH,INCLUDE=(1,1,CH,EQ,C'$',
OR,5220,1,CH,EQ,C'$'),
IFTHEN=(WHEN=(1,1,CH,EQ,C'$'),
BUILD=(1,5200)),
IFTHEN=(WHEN=NONE,
BUILD=(5201,5200))
OUTFIL FNAMES=MATCH,SAVE,
BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929)
person
Community
schedule
11.10.2013