2009-04-27 27 views
5

Tôi có hai tệp đầu vào, mỗi tệp có độ dài 5200 byte. Phím bảy byte được sử dụng để so sánh cả hai tệp, nếu có khớp thì nó cần phải được ghi vào tệp "trùng khớp" nhưng khi viết để khớp tệp, tôi cần một vài trường từ infile1 và tất cả các trường khác từ infile2.So sánh hai tệp và ghi nó vào các tệp "phù hợp" và "nomatch"

Nếu không có kết quả phù hợp thì hãy ghi vào no match tệp.

Có thể thực hiện điều đó trong sort không? Tôi biết nó có thể dễ dàng thực hiện bằng cách sử dụng chương trình COBOL nhưng chỉ muốn biết trong SORT/ICETOOL/Easytrieve Plus (EZTPA00).

Trả lời

0

Tôi đã sử dụng JCL khoảng 2 năm trước nên không thể viết mã cho bạn nhưng đây là ý tưởng;

  1. Có 2 bước
  2. Bước đầu tiên sẽ có ICETOOl nơi bạn có thể viết các hồ sơ phù hợp với tập tin phù hợp.
  3. Thứ hai, bạn có thể ghi một tệp không phù hợp bằng cách sử dụng SORT/ICETOOl hoặc chỉ bằng thao tác tệp.

một lần nữa tôi xin lỗi vì giải pháp mà không mã, nhưng tôi mất liên lạc bằng 2 năm +

+0

Đừng cần hai bước. Không cần ICETOOL. SORT với JOINKEYS sẽ làm điều đó. Từ những gì được mô tả, anyway. –

0

Trong Eztrieve nó thực sự dễ dàng, dưới đây là một ví dụ làm thế nào bạn có thể mã nó:

//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

FILEC sẽ trở nên khá vô dụng, vì bạn sẽ không biết điều gì đã đến từ đâu. TS/OP nên đã được yêu cầu này. Trở lại năm 2009. Không đối phó với các bản sao. May mắn thay, chúng ta hãy chỉ nói không có bản sao. Bạn có đảm bảo rằng các tệp được sắp xếp theo thứ tự không? Không? Sẽ không làm việc sau đó. Chương trình cũng có thể được thực hiện để làm việc cho các bản ghi có độ dài thay đổi. Khác với những thứ này, điều này có vẻ ổn. –

0

Mặc dù câu hỏi này đã được đăng lại rất lâu, tôi muốn trả lời vì nó có thể giúp người khác. Điều này có thể được thực hiện dễ dàng bằng phương tiện JOINKEYS trong bước SINGLE. Ở đây, mã giả:

  • Mã số JOINKEYS PAIRED(implicit) và nhận cả bản ghi qua định dạng được gửi. Nếu KHÔNG có kết quả trùng khớp nào từ một trong hai tệp thì hãy thêm/tiền tố một số ký tự đặc biệt, hãy nói '$'
  • So sánh qua IFTHEN cho '$', nếu không có bản ghi được ghép nối, nó sẽ được ghi vào tệp chưa ghép nối và còn lại vào tệp được ghép nối .

Vui lòng quay lại bất kỳ câu hỏi nào.

+0

Nếu bạn chỉ xử lý các bản ghi được ghép nối, bạn sẽ không nhận được bất kỳ sự không phù hợp nào. Nếu DFSORT thay vì SyncSort, không cần '$', nhưng có thể sử dụng điểm đánh dấu đối sánh được tích hợp? (đó là những gì các điểm đánh dấu phù hợp, nó không phải là một câu hỏi). –

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

Điều này sẽ không nhận được bất kỳ trận đấu nào và không khớp với F1. –

8

Kể từ 12.200 người đã xem xét vấn đề này và không có một câu trả lời:

DFSORT và SyncSort là Mainframe chủ yếu sắp xếp sản phẩm. Thẻ kiểm soát của họ có nhiều điểm tương đồng và một số khác biệt.

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  

Một "JOINKEYS" được tạo thành từ ba Tác vụ. Tiểu nhiệm vụ 1 là JOINKEYS đầu tiên. Tiểu nhiệm vụ 2 là JOINKEYS thứ hai. Nhiệm vụ chính sau và là nơi dữ liệu được nối được xử lý. Trong ví dụ trên, nó là một thao tác COPY đơn giản. Dữ liệu được nối sẽ chỉ được ghi vào SORTOUT.

Câu lệnh JOIN xác định rằng cũng như các bản ghi phù hợp, các bản ghi UNPAIRED F1 và F2 sẽ được trình bày cho Nhiệm vụ chính.

Câu lệnh REFORMAT xác định hồ sơ sẽ được trình bày cho Nhiệm vụ chính.Một ví dụ hiệu quả hơn, tưởng tượng rằng ba trường được yêu cầu từ F2, là:

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

Mỗi trường trên F2 được xác định với vị trí bắt đầu và độ dài.

Bản ghi sau đó được xử lý bởi tác vụ chính dài 5311 byte và các trường từ F2 có thể được tham chiếu bởi 5201,10,5211,1,5212,100 với bản ghi F1 là 1.5200.

Cách tốt hơn để đạt được điều tương tự là giảm kích thước F2 bằng JNF2CNTL.

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

Một số cài đặt của SyncSort không hỗ trợ JNF2CNTL, và kể cả trường hợp được hỗ trợ (từ Syncsort MFX cho z/OS phiên bản 1.4.1.0 trở đi), nó không được ghi nhận bởi SyncSort. Đối với người dùng 1.3.2 hoặc 1.4.0, bản cập nhật có sẵn từ SyncSort để cung cấp hỗ trợ JNFnCNTL.

Cần lưu ý rằng JOINKEYS theo mặc định SORTs dữ liệu, với tùy chọn EQUALS. Nếu dữ liệu cho tệp JOINKEYS đã được sắp xếp, SORTED sẽ được chỉ định. Đối với DFSORT NOSEQCHK cũng có thể được xác định nếu không cần kiểm tra trình tự.

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

Mặc dù yêu cầu lạ, nhưng không thể xác định được tệp gốc, tất cả các bản ghi chưa khớp sẽ được chuyển đến tệp đầu ra riêng biệt.

Với DFSORT, có một điểm đánh dấu phù hợp, được chỉ định với? trong REFORMAT:

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

Điều này làm tăng độ dài của bản ghi REFORMAT bởi một byte. Các ? có thể được chỉ định ở bất kỳ nơi nào trên bản ghi REFORMAT và không cần phải được chỉ định. Các ? được giải quyết bởi DFSORT thành: B, dữ liệu có nguồn gốc từ cả hai tệp; 1, bản ghi chưa từng có từ F1; 2, bản ghi chưa từng có từ F2.

SyncSort không có điểm đánh dấu phù hợp. Sự vắng mặt hoặc sự hiện diện của dữ liệu trên bản ghi REFORMAT phải được xác định bằng các giá trị. Chọn một byte trên cả hai bản ghi đầu vào mà không thể chứa một giá trị cụ thể (ví dụ, trong một số, quyết định giá trị không phải là số). Sau đó, chỉ định giá trị đó làm ký tự FILL trên REFORMAT.

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

Nếu vị trí 1 trên F1 không thể tự nhiên có "$" và vị trí 20 trên F2 không thể, thì hai vị trí đó có thể được sử dụng để thiết lập kết quả khớp. Toàn bộ hồ sơ có thể được kiểm tra nếu cần thiết, nhưng hút thêm thời gian CPU.

Yêu cầu rõ ràng là cho tất cả các bản ghi chưa khớp, từ F1 hoặc F2, được ghi vào một tệp. Điều này đòi hỏi một tuyên bố định dạng trong đó bao gồm cả các bản ghi trong toàn bộ của họ:

DFSORT, sản lượng kỷ lục chưa từng có:

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, sản lượng kỷ lục chưa từng có:

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)) 

Các mã hóa cho SyncSort cũng sẽ làm việc với DFSORT.

Để có được bản ghi phù hợp được viết dễ dàng.

OUTFIL FNAMES=MATCH,SAVE 

LƯU đảm bảo rằng tất cả các bản ghi không được viết bởi OUTFIL khác sẽ được viết ở đây.

Có một số yêu cầu định dạng lại, chủ yếu là dữ liệu đầu ra từ F1, nhưng để chọn một số trường từ F2. Điều này sẽ làm việc cho một trong hai DFSORT hoặc SyncSort:

OUTFIL FNAMES=MATCH,SAVE, 
    BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929) 

Toàn bộ điều, với bắt đầu và độ dài tùy ý là:

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) 
Các vấn đề liên quan