2009-11-18 29 views
29

Các tập tin đầu vào có hồ sơ như: 8712351,8712353,8712353,8712354,8712356,8712352,8712355 8712352,8712355Làm cách nào để có thể xóa các bản sao khỏi tệp bằng COBOL?

Sử dụng COBOL tôi cần phải loại bỏ bản sao từ tập tin trên và ghi vào một tập tin đầu ra. Tôi đã viết logic đơn giản để đọc các bản ghi và ghi vào một tệp đầu ra.

Tôi cần đặt logic ở đâu để loại bỏ các bản sao (ví dụ: 8712353,8712352) khỏi tệp ở trên. Dưới đây là chương trình logic:

IDENTIFICATION DIVISION. 
    PROGRAM-ID.RemoveDup. 
    ENVIRONMENT DIVISION. 
    INPUT-OUTPUT SECTION. 
    FILE-CONTROL. 
    SELECT INPUTFILEDUP ASSIGN TO 'C:\Cobol\INPUTFILEDUP.txt' 
      ORGANIZATION IS LINE SEQUENTIAL. 
    SELECT OUTFILEDUP ASSIGN TO 'C:\Cobol\OUTFILEDUP.txt' 
       ORGANIZATION IS LINE SEQUENTIAL. 

    DATA DIVISION. 

    FILE SECTION. 
    FD INPUTFILEDUP. 
    01 INPUTFILEDUPREC. 
     88 EOFINPUTFILEDUP VALUE HIGH-VALUES. 
     02 INPUTFILEID  PIC 9(07). 

    FD OUTFILEDUP. 
    01 OUTFILEDUPREC   PIC 9(07). 

    WORKING-STORAGE SECTION. 
    77 WS-VARIABLE   PIC 9(09). 
    77 REC-NOT-MATCH   PIC 9(01). 
    77 CUR-VARIABLE   PIC 9(09). 

    PROCEDURE DIVISION. 
    BEGIN. 
    OPEN INPUT INPUTFILEDUP 
    OPEN OUTPUT OUTFILEDUP 

    READ INPUTFILEDUP 
     AT END SET EOFINPUTFILEDUP TO TRUE 
    END-READ 
    PERFORM UNTIL (EOFINPUTFILEDUP) 
       WRITE OUTFILEDUPREC FROM INPUTFILEID 
       READ INPUTFILEDUP 
        AT END SET EOFINPUTFILEDUP TO TRUE 
          PERFORM UNTIL (EOFINPUTFILEDUP) 
    END-READ 
    END-PERFORM 
        CLOSE INPUTFILEDUP 
        CLOSE OUTFILEDUP 
    STOP RUN. 

tôi sắp xếp các tập tin đầu vào thứ tự tăng dần như sau: 8712351,8712353,8712353,8712354,8712356,8712352,8712355,8712352,8712355 Và nó làm việc, dưới đây là mã đã sửa đổi:

Nhưng giả sử nếu tệp của tôi không theo thứ tự tăng dần hoặc sắp xếp, nơi tôi cần phải viết logic sắp xếp trước khi loại bỏ dấu thăng. xin vui lòng bạn có thể cập nhật mã dưới đây của tôi cho điều này như tôi đã cố gắng nhưng không thành công trong việc này nếu cấu trúc fiel đầu vào là như:

8712351,8712353,8712353,8712354,8712356,8712352,8712355,8712352,8712355

IDENTIFICATION DIVISION. 
    PROGRAM-ID.RemoveDup2. 
    ENVIRONMENT DIVISION. 
    INPUT-OUTPUT SECTION. 
    FILE-CONTROL. 
    SELECT INPUTFILEDUP ASSIGN TO 'C:\Cobol\INPUTFILEDUP.txt' 
      ORGANIZATION IS LINE SEQUENTIAL. 
    SELECT OUTFILEDUP ASSIGN TO 'C:\Cobol\OUTFILEDUP.txt' 
       ORGANIZATION IS LINE SEQUENTIAL. 

    DATA DIVISION. 

    FILE SECTION. 
    FD INPUTFILEDUP. 
    01 INPUTFILEDUPREC. 
     88 EOFINPUTFILEDUP VALUE HIGH-VALUES. 
     02 INPUTFILEID  PIC 9(07). 

    FD OUTFILEDUP. 
    01 OUTFILEDUPREC   PIC 9(07). 

    WORKING-STORAGE SECTION. 
    77 WS-VARIABLE   PIC 9(09) VALUE ZERO. 
    77 REC-NOT-MATCH   PIC 9(01). 
    77 CUR-VARIABLE   PIC 9(7) VALUE ZERO. 

    PROCEDURE DIVISION. 
    BEGIN. 
    OPEN INPUT INPUTFILEDUP 
    OPEN OUTPUT OUTFILEDUP 

    READ INPUTFILEDUP 
     AT END SET EOFINPUTFILEDUP TO TRUE 
    END-READ 
    PERFORM UNTIL (EOFINPUTFILEDUP) 
     IF INPUTFILEID NOT EQUAL TO WS-VARIABLE 
       MOVE INPUTFILEID TO WS-VARIABLE 
       WRITE OUTFILEDUPREC FROM INPUTFILEID 
       READ INPUTFILEDUP 
        AT END SET EOFINPUTFILEDUP TO TRUE 
       PERFORM UNTIL (EOFINPUTFILEDUP) 
     ELSE 
       DISPLAY "dUPLICATE FOUND" INPUTFILEID 

    READ INPUTFILEDUP 
    AT END SET EOFINPUTFILEDUP TO TRUE 

    END-READ 

     END-PERFORM 

    CLOSE INPUTFILEDUP 
    CLOSE OUTFILEDUP 
    STOP RUN. 
+0

WOW thẻ yêu thích mới! :) Câu hỏi về dữ liệu mà từ đó bạn đang loại bỏ trùng lặp: là những con số như 8712351 tất cả sẽ xảy ra trong một phạm vi tương đối nhỏ gọn, chẳng hạn như 8700000-8800000? Hoặc là nó có thể cho các con số để thay đổi từ 1-N trên một phạm vi rất lớn? –

Trả lời

2

Khi OrganizationSequential, bản ghi đã xóa là bản ghi cuối cùng đã đọc. Tuyên bố Delete chỉ hợp lệ khi hoạt động cuối cùng đối với tệp là tuyên bố thành công Read. Nếu không, Delete trả về một giá trị File Status của 43. Vì một Delete không thể trở về File Status giá trị bắt đầu bằng một 2 khi tập tin là Open với Sequential Access, mã hóa Invalid Key trên Delete như vậy là không được phép.

Khi truy cập Dynamic hoặc Random được chọn cho tệp, số Delete, giống như Rewrite, trở nên ít hạn chế hơn. Bản ghi bị xóa không cần phải đọc trước. Chỉ cần điền thông tin chính của Key vào phần mô tả bản ghi để thoát và phát hành câu lệnh Delete. Nếu bản ghi không tồn tại, một số File Status trong số 23 được trả về và có điều kiện là Invalid Key.

Từ trang 274 của

Sams Teach Yourself COBOL in 24 Hours

trang 274 (mà tôi vừa phủi bụi xuống khỏi kệ sách của tôi). Vì vậy, trong trường hợp của bạn, bạn có thể thiết lập hồ sơ của mình để được sắp xếp theo INPUTFILEID, tạo một bản ghi khi bạn đi qua các lần xuất hiện của INPUTFILEID trước lần xuất hiện đầu tiên và Delete cho phù hợp (sau khi bạn đã ghi nó vào tệp đầu ra của mình) .

1

Nếu bạn sắp xếp tệp với một loại bên ngoài trước khi đọc nó trong chương trình cobol, bạn có thể loại bỏ các từ khóa trùng lặp với từ khóa SẮC. Nếu bạn sắp xếp các tập tin trước khi chương trình cobol và không thả trùng lặp sau đó một tuyên bố IF đơn giản và một lĩnh vực tiết kiệm sẽ cho phép bạn xóa các dups.

Thiết lập trường lưu INPUTFILEID. Ngay sau khi đọc ....IF inputfileid bằng inputfileid-save đọc lại nếu không viết ... sau khi di chuyển write inputfileid thành inputfileid-save. Bạn sẽ phải phá vỡ các hiện tại thực hiện để làm điều này.

Nếu bạn không hiểu đầy đủ những gì tôi đang nói và sẽ giúp bạn thay đổi mã, hãy cho tôi biết

5

Cuối cùng Nó hoạt động. Đây là mã

IDENTIFICATION DIVISION. 
    PROGRAM-ID.RemoveDup2. 
    ENVIRONMENT DIVISION. 
    INPUT-OUTPUT SECTION. 
    FILE-CONTROL. 
    SELECT INPUTFILEDUP ASSIGN TO 'C:\Cobol\INPUTFILEDUP.txt' 
      ORGANIZATION IS LINE SEQUENTIAL. 
    SELECT OUTFILEDUP ASSIGN TO 'C:\Cobol\OUTFILEDUP.txt' 
       ORGANIZATION IS LINE SEQUENTIAL. 
    SELECT WorkFile ASSIGN TO "WORK.TMP". 

    DATA DIVISION. 

    FILE SECTION. 
    FD INPUTFILEDUP. 
    01 INPUTFILEDUPREC. 
     88 EOFINPUTFILEDUP VALUE HIGH-VALUES. 
     02 INPUTFILEID  PIC 9(07). 

    FD OUTFILEDUP. 
    01 OUTFILEDUPREC   PIC 9(07). 

    SD WorkFile. 
    01 WORKREC. 
     02 WINPUTFILEID  PIC 9(07). 

    WORKING-STORAGE SECTION. 
    77 WS-VARIABLE   PIC 9(09) VALUE ZERO. 
    77 REC-NOT-MATCH   PIC 9(01). 
    77 CUR-VARIABLE   PIC 9(7) VALUE ZERO. 

    PROCEDURE DIVISION. 
    BEGIN. 
     SORT WorkFile ON ASCENDING KEY WINPUTFILEID 
     USING INPUTFILEDUP GIVING INPUTFILEDUP 

    OPEN INPUT INPUTFILEDUP 
    OPEN OUTPUT OUTFILEDUP 

     READ INPUTFILEDUP 
       AT END SET EOFINPUTFILEDUP TO TRUE 
    END-READ 
     PERFORM UNTIL (EOFINPUTFILEDUP) 
      IF INPUTFILEID NOT EQUAL TO WS-VARIABLE 
        MOVE INPUTFILEID TO WS-VARIABLE 
        WRITE OUTFILEDUPREC FROM INPUTFILEID 
        READ INPUTFILEDUP 
         AT END SET EOFINPUTFILEDUP TO TRUE 
     PERFORM UNTIL (EOFINPUTFILEDUP) 
      ELSE 
        DISPLAY "DUPLICATE FOUND " INPUTFILEID 

    READ INPUTFILEDUP 
       AT END SET EOFINPUTFILEDUP TO TRUE 
    END-READ 
    END-PERFORM 

    CLOSE INPUTFILEDUP 
    CLOSE OUTFILEDUP 

    STOP RUN. 
1

sort là tiêu chuẩn cho các công việc os-gần theo nguyên tắc DRY, bánh răng -t cho tách và -u cho uniques. Đó là C.

Các vấn đề liên quan