web-dev-qa-db-ja.com

2つのファイルを比較し、「一致」ファイルと「不一致」ファイルに書き込みます

2つの入力ファイルがあり、それぞれの長さは5200バイトです。両方のファイルを比較するために7バイトのキーが使用されます。一致する場合は、「一致する」ファイルに書き込む必要がありますが、一致するファイルに書き込む場合は、infile1のいくつかのフィールドとinfile2の他のすべてのフィールドが必要です。

一致するものがない場合は、no matchファイルに書き込みます。

sortでそれを行うことは可能ですか? COBOLプログラムを使用して簡単に実行できることは知っていますが、SORT/ICETOOL/Easytrieve Plus (EZTPA00)で知りたいだけです。

5
deepu

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」は3つのタスクで構成されています。サブタスク1は最初のJOINKEYSです。サブタスク2は2番目のJOINKEYSです。メインタスクが続き、結合されたデータが処理される場所です。上記の例では、これは単純なCOPY操作です。結合されたデータは単にSORTOUTに書き込まれます。

JOINステートメントは、一致したレコードだけでなく、ペアリングされていないF1およびF2レコードがメインタスクに提示されることを定義します。

REFORMATステートメントは、メインタスクに提示されるレコードを定義します。 F2から3つのフィールドが必要であると想像すると、より効率的な例は次のとおりです。

 REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100)

F2の各フィールドは、開始位置と長さで定義されます。

メインタスクによって処理されるレコードの長さは5311バイトであり、F2のフィールドは5201,10,5211,1,5212,100で参照でき、F1レコードは1,5200です。

同じことを達成するためのより良い方法は、JNF2CNTLを使用してF2のサイズを縮小することです。

//JNF2CNTL DD *
  INREC BUILD=(207,1,10,30,1,5100,100)

SyncSortの一部のインストールはJNF2CNTLをサポートしておらず、サポートされている場合でも(Syncsort MFX for z/OSリリース1.4.1.0以降)、SyncSortによって文書化されていません。 1.3.2または1.4.0のユーザーの場合、JNFnCNTLサポートを提供するためのアップデートがSyncSortから入手できます。

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レコードの長さが1バイト増加します。 ? REFORMATレコードの任意の場所で指定でき、指定する必要はありません。 ? DFSORTによって次のように解決されます。B、両方のファイルから供給されたデータ。 1、F1からの比類のないレコード。 2、F2からの比類のないレコード。

SyncSortには一致マーカーがありません。 REFORMATレコードのデータの有無は、値によって判別する必要があります。特定の値を含めることができない両方の入力レコードのバイトを選択します(たとえば、数値内で、数値以外の値を決定します)。次に、その値をREFORMATのFILL文字として指定します。

 REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100),FILL=C'$'

F1の位置1が自然に「$」を持つことができず、F2の位置20も持つことができない場合、これら2つの位置を使用して一致の結果を確立できます。必要に応じてレコード全体をテストできますが、CPU時間が長くなります。

明らかな要件は、F1またはF2のいずれかからの、一致しないすべてのレコードを1つのファイルに書き込むことです。これには、両方のレコードを完全に含む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)
8
Bill Woodger

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
Laurindo

私は約2年前にJCLを使用していたので、コードを書くことはできませんが、ここにアイデアがあります。

  1. 2つのステップがあります
  2. 最初のステップには、一致するレコードを一致するファイルに書き込むことができるICETOOlがあります。
  3. 次に、SORT/ICETOOlを使用するか、ファイル操作だけで、不一致のファイルを書き込むことができます。

もう一度、コードなしの解決策についてお詫びしますが、2年以上連絡が取れません

0
adbanginwar
//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
raji

この質問は本当に長い間投稿されましたが、他の人に役立つかもしれないので答えたいと思います。これは、SINGLEステップでJOINKEYSを使用して簡単に実行できます。疑似コードは次のとおりです。

  • JOINKEYS PAIRED(implicit)をコーディングし、ファイルを再フォーマットして両方のレコードを取得します。どちらのファイルにも一致するものがない場合は、'$'などの特殊文字を追加/プレフィックスします。
  • IFTHENを介して'$'を比較します。存在する場合は、ペアのレコードがなく、ペアのないファイルに書き込まれ、ペアのファイルに残ります。

ご不明な点がございましたら、お返事ください。

0
Raja Reddy