Сравните два файла и запишите его в файлы «match» и «nomatch» - PullRequest
5 голосов
/ 27 апреля 2009

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

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

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

Ответы [ 5 ]

8 голосов
/ 11 октября 2013

Поскольку 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 - это первые СОЕДИНЕНИЯ. Подзадача 2 является вторым JOINKEYS. Основная задача следует и где обрабатываются объединенные данные. В приведенном выше примере это простая операция COPY. Объединенные данные будут просто записаны в SORTOUT.

Оператор JOIN определяет, что наряду с сопоставленными записями записи UNPAIRED 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)

Syncsort

  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)
0 голосов
/ 31 августа 2012
//STEP01   EXEC SORT90MB                        
//SORTJNF1 DD DSN=INPUTFILE1,   
//            DISP=SHR                          
//SORTJNF2 DD DSN=INPUTFILE2,   
//            DISP=SHR                          
//SORTOUT  DD DSN=MISMATCH_OUTPUT_FILE, 
//            DISP=(,CATLG,DELETE),             
//            UNIT=TAPE,                        
//            DCB=(RECFM=FB,BLKSIZE=0),         
//            DSORG=PS                          
//SYSOUT   DD SYSOUT=*                          
//SYSIN    DD *                                 
  JOINKEYS FILE=F1,FIELDS=(1,79,A)              
  JOINKEYS FILE=F2,FIELDS=(1,79,A)              
  JOIN UNPAIRED,F1,ONLY                         
  SORT FIELDS=COPY                              
/*                                              
0 голосов
/ 21 января 2010

В 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                                                          
/*                       
0 голосов
/ 01 мая 2011

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

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

Пожалуйста, ответьте на любые вопросы.

0 голосов
/ 27 апреля 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...