一千萬個為什麽

搜索

比較兩個文件並將其寫入“匹配”和“不匹配”文件

我有兩個輸入文件,每個文件長度為5200字節。一個七字節的鍵用於比較兩個文件,如果有匹配,那麽它需要寫入“匹配”文件,但寫入匹配文件時,我需要 infile1 和其他所有其他字段來自 infile2 的字段。

如果沒有匹配,則寫入不匹配文件。

是否可以在 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”由三個任務組成。子任務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。

實現同樣目標的更好方法是用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的用戶,Syncsort公司提供更新以提供JNFnCNTL支持。

應該註意的是,默認情況下,JOINKEYS使用選項EQUALS來排序數據。如果JOINKEYS文件的數據已經按順序排列,則應指定SORTED。對於DFSORT如果不需要序列檢查,也可以指定NOSEQCHK。

 JOINKEYS FILE=F1,FIELDS=(key1startpos,7,A),SORTED,NOSEQCHK

雖然請求很奇怪,因為源文件將無法確定,所有不匹配的記錄將轉到單獨的輸出文件。

在DFSORT中,有一個匹配標記,用?在REFORMAT:

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

這會將REFORMAT記錄的長度增加一個字節。這個?可以在REFORMAT記錄的任何位置指定,不需要指定。這個?由DFSORT解決:B,源自兩個文件的數據; 1,來自F1的無與倫比的紀錄; 2,來自F2的無與倫比的記錄。

Syncsort公司沒有匹配標記。 REFORMAT記錄中的數據缺失或存在必須由值決定。在兩個輸入記錄中選擇一個不能包含特定值的字節(例如,在一個數字中,決定一個非數字值)。然後將該值指定為REFORMAT上的填充字符。

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

如果F1上的位置1不能自然地具有“$”並且F2上的位置20也不能,那麽可以使用這兩個位置來確定匹配的結果。整個記錄可以根據需要進行測試,但會占用更多的CPU時間。

明顯的要求是將所有來自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)

轉載註明原文: 比較兩個文件並將其寫入“匹配”和“不匹配”文件