2つの入力ファイルがあり、それぞれの長さは5200バイトです。両方のファイルを比較するために7バイトのキーが使用されます。一致する場合は、「一致する」ファイルに書き込む必要がありますが、一致するファイルに書き込む場合は、infile1
のいくつかのフィールドとinfile2
の他のすべてのフィールドが必要です。
一致するものがない場合は、no match
ファイルに書き込みます。
sort
でそれを行うことは可能ですか? COBOLプログラムを使用して簡単に実行できることは知っていますが、SORT/ICETOOL/Easytrieve Plus (EZTPA00)
で知りたいだけです。
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)
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
/*
私は約2年前にJCLを使用していたので、コードを書くことはできませんが、ここにアイデアがあります。
もう一度、コードなしの解決策についてお詫びしますが、2年以上連絡が取れません
//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
/*
この質問は本当に長い間投稿されましたが、他の人に役立つかもしれないので答えたいと思います。これは、SINGLEステップでJOINKEYS
を使用して簡単に実行できます。疑似コードは次のとおりです。
JOINKEYS PAIRED(implicit)
をコーディングし、ファイルを再フォーマットして両方のレコードを取得します。どちらのファイルにも一致するものがない場合は、'$'
などの特殊文字を追加/プレフィックスします。'$'
を比較します。存在する場合は、ペアのレコードがなく、ペアのないファイルに書き込まれ、ペアのファイルに残ります。ご不明な点がございましたら、お返事ください。