сравнить два файла, затем сопоставить и объединить записи, чтобы скопировать два файла различий

У меня есть требование сравнить два файла, затем сопоставить записи одного файла и не сопоставить с другим файлом, используя ключи соединения в jcl. Я не уверен, правильно ли это или нет. Не могли бы вы мне помочь? первый входной файл имеет единственную длину 18 записей, которая будет сравниваться с длиной первых 18 записей input2. Если она совпадает, мы записываем запись в выходной файл на основе условия сборки, а если не совпадает, то копируем запись в другой файл.

SORT FIELDS=COPY                             
JOINKEYS FILE=F1,FIELDS=(1,18,A)             
JOINKEYS FILE=F2,FIELDS=(1,18,A)             
REFORMAT FIELDS=(F2:1,258,F2:264,1,F2:334,2) 
OUTFIL FNAMES=MATCH                          
SORT FIELDS=COPY                             
JOINKEYS FILE=F1,FIELDS=(1,18,A)             
JOINKEYS FILE=F2,FIELDS=(1,18,A)             
JOIN UNPAIRED,F2,ONLY                        
REFORMAT FIELDS=(F2:1,258,F2:264,1,F2:334,2) 
OUTFIL FNAMES=UNMATCH                        

person Mahesh Kumar    schedule 12.10.2018    source источник
comment
С чего вы взяли, что это может быть неправильно?   -  person Scott Hunter    schedule 12.10.2018


Ответы (3)


Добро пожаловать в Stack Overflow! Вы должны использовать метод индикатора в dfsort, чтобы получить то, что вы ожидаете. См. ниже операторы SORT.

JOINKEYS FILE=F1,FIELDS=(1,18,A)             
JOINKEYS FILE=F2,FIELDS=(1,18,A)             
REFORMAT FIELDS=(F2:1,258,F2:264,1,F2:334,2,?) 
OUTFIL FNAMES=BOTH,INCLUDE=(262,1,CH,EQ,C'B'),BUILD=(1,261)                          
OUTFIL FNAMES=F1ONLY,INCLUDE=(262,1,CH,EQ,C'1'),BUILD=(1,258)
OUTFIL FNAMES=F2ONLY,INCLUDE=(262,1,CH,EQ,C'2'),BUILD=(259,3)

? в REFORMAT FIELD отвечает за заполнение индикатора на 262-й позиции. Если ключ совпадает в обоих файлах, 262-я позиция будет иметь B, что означает ОБА. Если ключ не совпадает, 262-я позиция сообщит, из какого файла запись, 1 или 2.

Примечание.

  • Вы можете изменить оператор BUILD, чтобы записать нужные вам столбцы, если ключи не совпадают. Убедитесь, что эти столбцы упоминаются в файле REFORMAT FIELDS.

  • Убедитесь, что в JCL есть имена DD BOTH, F1ONLY и F2ONLY.

Подробнее здесь

person Srinivasan JV    schedule 12.10.2018

Я попытался с приведенным ниже примером. Он работает нормально. Длина записи входных и выходных файлов 80. Формат записи (RECFM) FB.

//SYSIN    DD    *                                          
  JOINKEYS FILE=F1,FIELDS=(1,10,A),SORTED                   
  JOINKEYS FILE=F2,FIELDS=(1,10,A),SORTED                   
  JOIN UNPAIRED,F1,F2                                       
  REFORMAT FIELDS=(F1:1,10,F2:1,10,?)                       
  OPTION COPY                                               
  OUTFIL FNAMES=F1ONLY,INCLUDE=(21,1,CH,EQ,C'1'),           
  BUILD=(1,10,70X)                                          
  OUTFIL FNAMES=F2ONLY,INCLUDE=(21,1,CH,EQ,C'2'),           
  BUILD=(11,10,70X)                                         
  OUTFIL FNAMES=BOTH,INCLUDE=(21,1,CH,EQ,C'B'),             
  BUILD=(1,10,70X)                                          
/*
person Dhans    schedule 28.10.2019

Вы можете реализовать логику, используя 1. Программу JCL — использование КЛЮЧЕЙ JOIN 2. Программу COBOL — логику сопоставления файлов (обе логики объясняются в следующей ссылке) 3. Программа Easytrieve или REXX

https://www.youtube.com/watch?v=pQumm7ueYik&list=PLB4QPUJFZRcTsP1cKe2sSIObFMlvkyjnn&index=4" rel="nofollow noreferrer"> 4

person Chandra    schedule 12.10.2019
comment
Ссылка на решение приветствуется, но убедитесь, что ваш ответ полезен и без нее: добавьте контекст вокруг ссылки, чтобы ваш коллега пользователи будут иметь некоторое представление о том, что это такое и почему оно там, а затем процитируйте наиболее важную часть страницы, на которую вы ссылаетесь, в случае, если целевая страница недоступна. Ответы, которые представляют собой не более чем ссылку, могут быть удалены. - person Alessio; 12.10.2019