Сравните два файла и запишите их в файлы соответствия и несоответствия.

У меня есть два входных файла, каждый длиной 5200 байт. Семибайтовый ключ используется для сравнения обоих файлов, если есть совпадение, то его нужно записать в файл «соответствия», но при записи в файл соответствия мне нужны несколько полей из infile1 и все остальные поля из infile2.

Если совпадения нет, запишите в файл no match.

Можно ли это сделать в sort? Я знаю, что это можно легко сделать с помощью программы COBOL, но просто хочу знать в SORT/ICETOOL/Easytrieve Plus (EZTPA00).


person Community    schedule 27.04.2009    source источник


Ответы (5)


Поскольку 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

Я использовал JCL около 2 лет назад, поэтому не могу написать код для вас, но вот идея;

  1. Есть 2 шага
  2. Первый шаг будет иметь ICETOOL, где вы можете записать совпадающие записи в совпадающий файл.
  3. Во-вторых, вы можете записать файл для несоответствия, используя SORT/ICETOOL или просто файловые операции.

еще раз прошу прощения за решение без кода, но я не на связи уже 2 года+

person adbanginwar    schedule 27.04.2009
comment
Не нужно двух шагов. Не нужен АЙСТУЛ. SORT с JOINKEYS сделает это. Во всяком случае, из того, что описано. - person Bill Woodger; 11.10.2013

Хотя этот вопрос был опубликован очень давно, я хочу ответить, так как это может помочь другим. Это можно легко сделать с помощью JOINKEYS за ОДИН шаг. Вот псевдокод:

  • Код JOINKEYS PAIRED(implicit) и получить обе записи путем переформатирования файла. Если совпадений НЕТ ни в одном из файлов, добавьте/префикс какой-либо специальный символ, скажем, '$'
  • Сравните через IFTHEN для '$', если существует, то у него нет парной записи, она будет записана в непарный файл, а остальная часть - в парный файл.

Пожалуйста, вернитесь в случае возникновения каких-либо вопросов.

person Raja Reddy    schedule 01.05.2011
comment
Если вы имеете дело только с парными записями, вы не получите никаких несоответствий. Если DFSORT вместо SyncSort, не нужен «$», но можно ли использовать встроенный маркер совпадения? (вот что такое маркер матча, это не вопрос). - person Bill Woodger; 11.10.2013

В Eztrieve это очень просто, ниже приведен пример того, как это можно сделать:

//STEP01   EXEC PGM=EZTPA00                                        
//FILEA    DD DSN=FILEA,DISP=SHR   
//FILEB    DD DSN=FILEB,DISP=SHR
//FILEC    DD DSN=FILEC.DIF,    
//            DISP=(NEW,CATLG,DELETE),                             
//            SPACE=(CYL,(100,50),RLSE),                           
//            UNIT=PRMDA,                                          
//            DCB=(RECFM=FB,LRECL=5200,BLKSIZE=0)                  
//SYSOUT   DD SYSOUT=*                                             
//SRTMSG   DD SYSOUT=*                                             
//SYSPRINT DD SYSOUT=*                                             
//SYSIN    DD *                                                    
 FILE FILEA                                                        
   FA-KEY       1   7 A                                         
   FA-REC1      8  10 A
   FA-REC2     18   5 A

 FILE FILEB                                                        
   FB-KEY       1   7 A                                         
   FB-REC1      8  10 A                                         
   FB-REC2     18   5 A                                         

 FILE FILEC                                                        

 FILE FILED                                                        
   FD-KEY       1   7 A                                         
   FD-REC1      8  10 A                                         
   FD-REC2     18   5 A                                         


 JOB INPUT (FILEA KEY FA-KEY FILEB KEY FB-KEY)                     
   IF MATCHED            
      FD-KEY   =  FB-KEY                                      
      FD-REC1  =  FA-REC1
      FD-REC2  =  FB-REC2
      PUT FILED
   ELSE
      IF FILEA
         PUT FILEC FROM FILEA                                         
      ELSE
         PUT FILEC FROM FILEB
      END-IF                                         
   END-IF                                                          
/*                       
person Laurindo    schedule 21.01.2010
comment
FILEC будет довольно бесполезен, так как вы не будете знать, что откуда взялось. TS / OP должны были спросить об этом. Еще в 2009 году. Не работает с дубликатами. К счастью, скажем так, нет дубликатов. Вы убедились, что файлы упорядочены по ключу? Нет? Тогда не получится. Программу также можно настроить для работы с записями переменной длины. Кроме этих вещей, это выглядит хорошо. - person Bill Woodger; 11.10.2013

person    schedule
comment
Это не даст совпадений вообще, а несоответствия только из F1. - person Bill Woodger; 11.10.2013