Сравните файлы с DFSORT, вставьте строку "ДОБАВИТЬ" перед новыми записями
У меня есть 2 рабочих файла: старый (F1) и новый (F2), одинаковой длины. Я должен сравнить как файлы запись за записью, так и для любых новых записей в новом (F2) рабочем файле, я должен вставить "ADD" перед ним в начальных 3 позициях, а для остальных записей (совпавших) это должны быть пробелы,
На данный момент я могу копировать записи, которые находятся в F2, но не в F1, используя следующий код:
//SYSIN DD *
JOINKEYS FILE=F1,FIELDS=(1,79,A)
JOINKEYS FILE=F2,FIELDS=(1,79,A)
JOIN UNPAIRED,F2,ONLY
SORT FIELDS=COPY
/*
но мне нужны все записи из F2 со строкой 'NEW' перед новыми записями, это можно сделать за один шаг?
1 ответ
Кажется, это то, что вы хотите. Я не уверен, что вы захотите это в ближайшее время.
Все записи в каждом файле будут отсортированы по всей их длине. Это означает, что для первого запуска ваш вывод будет отличаться от входного.
"Изменение" будет выглядеть точно так же, как НОВОЕ, если изменение возможно.
Если вы в порядке с обоими из них, вы должны были сказать это в своем вопросе.
//SYSIN DD *
JOINKEYS FILE=F1,FIELDS=(1,79,A)
JOINKEYS FILE=F2,FIELDS=(1,79,A)
JOIN UNPAIRED,F2
REFORMAT FIELDS=(?,F2:1,2,1,79)
INREC IFTHEN=(WHEN=(1,1,CH,EQ,C'2'),
OVERLAY=(1:C'NEW')),
IFTHEN=(WHEN=(NONE,
OVERLAY=(1:3X))
SORT FIELDS=COPY
UNPAIRED,F2 получит вам все совпадения, а также те из F2 (ваш НОВЫЙ вход), которые не совпадают.
Оператор REFORMAT помещает маркер соответствия соединения (?) В первую позицию, затем помещает два байта чего-либо, а затем все данные. Запись REFORMAT будет 82 байта.
В INREC поле, полученное из маркера совпадения, проверяется, поэтому при необходимости запись NEW может быть наложена на начало записи. Иначе три заготовки будут перекрыты.
Есть более понятный способ выразить тот же результат:
//SYSIN DD *
JOINKEYS FILE=F1,FIELDS=(1,79,A)
JOINKEYS FILE=F2,FIELDS=(1,79,A)
JOIN UNPAIRED,F2
REFORMAT FIELDS=(?,F2:1,79)
INREC IFTHEN=(WHEN=(1,1,CH,EQ,C'2'),
BUILD=(C'NEW',2,79)),
IFTHEN=(WHEN=(NONE,
BUILD=(3X,2,79)),
SORT FIELDS=COPY
На этот раз используется BUILD, а не OVERLAY.
С лучшим (любым?) Знанием ваших данных могут быть доступны лучшие решения.
Даже с информацией, предоставленной на другом сайте, но не здесь, этого недостаточно.
//SYSIN DD *
JOINKEYS FILE=F1,FIELDS=(1,79,A)
JOINKEYS FILE=F2,FIELDS=(1,79,A)
JOIN UNPAIRED,F2,ONLY
SORT FIELDS=COPY
/*
Мы можем догадаться, что ваш файл 79, FB, но это не обязательно.
Просто получить несоответствия и поставить NEW на передний план с существующим кодом, легко:
//SYSIN DD *
JOINKEYS FILE=F1,FIELDS=(1,79,A)
JOINKEYS FILE=F2,FIELDS=(1,79,A)
JOIN UNPAIRED,F2,ONLY
INREC BUILD=(C'NEW',1,79)
SORT FIELDS=COPY
Вы выводите, конечно, теперь 82 байта на запись.
Однако это предполагает, что у вас нет (и никогда не будет) дубликатов на вашем 79-байтовом ключе, и что вся ваша запись составляет 79 байтов.
Это также предполагает, что вы не заботитесь о порядке выходного файла.
Каждый JOINKEYS сортирует свой файл, а затем данные представляются в соответствующий процесс.
Имейте в виду, что с изменением и этим методом проверки (сортировка всей записи, сравнение всей записи) вам будет трудно не выводить две записи для записи, которая логически одинакова. Один будет выглядеть как Delete (из F1), а другой - как NEW (по F2), тогда как взятые вместе являются просто Change.