Сравните файлы с помощью DFSORT, вставьте строку «ДОБАВИТЬ» перед новыми записями.

У меня есть 2 рабочих файла: старый (F1) и новый (F2), оба одинаковой длины. Я должен сравнить обе записи файлов за записью и для любых новых записей в новом (F2) рабочем файле, я должен вставить «ДОБАВИТЬ» перед ним в начальных 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» перед новыми записями, можно ли это сделать за один шаг?


person Abhin    schedule 10.11.2014    source источник
comment
Пожалуйста, покажите нам, что вы уже пробовали.   -  person cschneid    schedule 10.11.2014
comment
RECFM и LRECL? Есть ли ключ, или как иначе продолжить сравнение?   -  person Bill Woodger    schedule 10.11.2014


Ответы (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 СОРТИРУЕТ свой файл, а затем данные представляются процессу сопоставления.

Имейте в виду, что с изменением и этим методом проверки (сортировка всей записи, сравнение всей записи) вам будет трудно не вывести две записи для записи, которая логически одинакова. Один будет выглядеть как Удалить (из F1), а другой как НОВЫЙ (по F2), тогда как все вместе они представляют собой просто Изменение.

person Bill Woodger    schedule 11.11.2014
comment
Практически все можно сделать. Ключ в том, чтобы знать точно чего вы хотите, прежде чем приступить к работе. Вопросы, которые меняются, так называемые вопросы-хамелеоны, здесь не любят. Если это помогло, вы должны принять этот ответ (если вы видите контур большой галочки рядом с ответом, нажмите на него, и он должен заполниться зеленым), а затем попытайтесь решить точно что вам нужно и задайте новый вопрос с этим. - person Bill Woodger; 12.11.2014
comment
Спасибо за подробный ответ. вашего второго решения достаточно для моих требований на данный момент. как вы предложили, если я хочу, чтобы НОВЫЕ записи были первыми, а старые записи после него в файле, можем ли мы это сделать. Я забыл упомянуть, что у меня есть заголовочный файл, который всегда должен быть вверху :( Я новичок в JOINKEYS, но раньше использовал обычную сортировку. - person Abhin; 12.11.2014
comment
Вам нужно задать это как новый вопрос, а не в комментариях. В правом верхнем углу страницы, Ask Question. - person Bill Woodger; 12.11.2014