2012-12-20 47 views
5

Cần nối bốn chuỗi vào một biến đích trong cobol.Chuỗi liên kết theo chiều dài COBOL

Giống như,

01 WS-S1 X(10) VALUE "HI ". 
01 WS-S2 X(10) VALUE "HOW ". 
01 WS-S3 X(10) VALUE "ARE ". 
01 WS-S4 X(10) VALUE "YOU?". 

thành một chuỗi kết quả

"HI HOW ARE YOU?" 

bất cứ ai có thể vui lòng giúp tôi ra?

Trả lời

20

Dưới đây là một ví dụ làm việc của STRING verb mà những gì bạn đang tìm kiếm:

IDENTIFICATION DIVISION. 
    PROGRAM-ID. EXAMPLE. 
    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    01 WS-S1 PIC X(10) VALUE 'HI '. 
    01 WS-S2 PIC X(10) VALUE 'HOW '. 
    01 WS-S3 PIC X(10) VALUE 'ARE '. 
    01 WS-S4 PIC X(10) VALUE 'YOU?'. 
    01 WS-CONCAT PIC X(43) VALUE SPACES. 
    PROCEDURE DIVISION. 
    MAIN-PARAGRAPH. 
     STRING WS-S1 DELIMITED BY SPACE 
       ' ' DELIMITED BY SIZE 
       WS-S2 DELIMITED BY SPACE 
       ' ' DELIMITED BY SIZE 
       WS-S3 DELIMITED BY SPACE 
       ' ' DELIMITED BY SIZE 
       WS-S4 DELIMITED BY SPACE 
      INTO WS-CONCAT 
     END-STRING 
     DISPLAY '>' WS-CONCAT '<' 
     GOBACK 
     . 

Output là:

>HI HOW ARE YOU?       < 
2

OpenCOBOL có phần mở rộng CHỨC NĂNG nội tại, CONCATENATE.

DISPLAY FUNCTION CONCATENATE(
    FUNCTION TRIM(WS-S1); SPACE; 
    FUNCTION TRIM(WS-S2); SPACE; 
    FUNCTION TRIM(WS-S3); SPACE; 
    FUNCTION TRIM(WS-S4)) 
END-DISPLAY 

nhưng tôi thích động từ STRING TẮT PHÉP, vì nó sẽ làm việc với hầu hết, nếu không phải tất cả, trình biên dịch.

Như để lý do cho delimiters dấu chấm phẩy trong danh sách tham số chức năng, nó không phải là thực sự cần thiết, sở thích cá nhân, vì nó đôi khi tránh được các vấn đề tiềm năng với

SPECIAL-NAMES. 
DECIMAL POINT IS COMMA. 

và COBOL, là mạnh mẽ từ vựng động vật đó là

DISPLAY FUNCTION CONCATENATE(WS-S1 WS-S2 WS-S3 WS-S4) 
DISPLAY FUNCTION CONCATENATE(WS-S1, WS-S2, WS-S3, WS-S4) 

cú pháp cũng hoạt động.

0

Có vấn đề với 'được phân tách bằng dấu cách'. Nếu ws-s1 = 'how are' - được phân tách bằng dấu cách sẽ chỉ đặt 'how'. Dưới đây là một số ví dụ:

01 ws-string-test. 
03 y1    pic x(10) value 'y1 a'. 
03 y2    pic x(10) value 'y2 b'. 
03 y3    pic x(10) value 'y3 c'. 

01 ảnh công việc x (200).

 move spaces to ws-work 
     string y1 delimited by size 
       y2 delimited by space 
       y3 delimited by size 
       into ws-work. 
     ws-work = "y1 a  y2y3 c    " 

     move spaces to ws-work 
     string y1 
       y2 
       y3 
       delimited by size into ws-work 
     ws-work = "y1 a  y2 b   y3 c   " 


     string y1 
       y2 
       y3 
       delimited by spaces into ws-work. 
     ws-work = "y1y2y3 

     string y1 y2 y3 into ws-work by csv-format. 
     ws-work = "y1 a,y2 b,y3 c  " 

Hy vọng điều đó sẽ hữu ích.

zalek

+0

Điều này không giải quyết được câu hỏi thực tế. Bạn đang sử dụng trình biên dịch COBOL nào để hỗ trợ cú pháp cuối cùng mà bạn hiển thị cho 'STRING'? Nó không chuẩn. –

0

Làm cho điều này trở nên lung lay. Nên nền tảng độc lập.

DATA DIVISION. 

    WORKING-STORAGE SECTION. 

    01 result-string-text   X(100). 
    01 result-string-length   9(03). 
    01 result-string-datalength  9(03). 

    01 new-string-text    X(20). 
    01 new-string-length   9(03). 
    01 new-string-datalength  9(03). 

    01 hold-string-text    X(100). 

    01 trailing-space-count   9(03). 

    PROCEDURE DIVISION. 

     MOVE SPACES TO result-string-text. 
     MOVE FUNCTION LENGTH(result-string-text) TO result-string-length. 
     MOVE FUNCTION LENGTH(new-string-text) TO new-string-length. 

     MOVE ws-s1 TO new-string-text. 
     PERFORM 5500-concatenate. 

     MOVE ws-s2 TO new-string-text. 
     PERFORM 5500-concatenate. 

     MOVE ws-s3 TO new-string-text. 
     PERFORM 5500-concatenate. 

     MOVE ws-s4 TO new-string-text. 
     PERFORM 5500-concatenate. 

    5500-concatenate. 
     MOVE ZERO TO trailing-space-count 
     INSPECT FUNCTION REVERSE(result-string-text) TALLYING trailing-space-count FOR LEADING ' ' 
     COMPUTE result-string-datalength = result-string-length - trailing-space-count 

     IF (result-string-datalength > ZERO) 
      MOVE ZERO TO trailing-space-count 
      INSPECT FUNCTION REVERSE(new-string-text) TALLYING trailing-space-count FOR LEADING ' ' 
      COMPUTE new-string-datalength = new-string-length - trailing-space-count 

      MOVE SPACES TO hold-string-text 
      STRING 
       result-string-text(1:result-string-datalength) 
       ' ' 
       new-string-text(1:new-string-datalength) 
        DELIMITED BY SIZE 
      INTO 
       hold-string-text 
      END-STRING 

      MOVE hold-string-text to result-string-text 
     ELSE 
      MOVE new-string-text TO result-string-text 
     END-IF. 
+0

Thả 'MOVE SPACES TO chuỗi kết quả văn bản', thay đổi' MOVE ws-s1 thành chuỗi ký tự mới thành 'MOVE ws-s1 thành chuỗi kết quả'. Điều này loại bỏ 'IF' của bạn trong' 5500-'. Sử dụng 'WITH POINTER' sẽ loại bỏ' giữ-chuỗi-văn bản'. Điều này sẽ làm giảm kích thước của đoạn của bạn khoảng 1/3, làm cho nó rõ ràng hơn và dễ dàng hơn để duy trì. Một số, không phải tôi, sẽ sử dụng sửa đổi tham chiếu cho toàn bộ sự việc. Trong ví dụ cụ thể thực tế, với đảm bảo không có không gian được nhúng, 'STRING' đơn giản trong câu trả lời được chấp nhận là đủ. –

+0

Bạn có những điểm tuyệt vời, Bill. Trong khi tôi mò mẫm với POINTER đầy đủ, tôi không chắc mọi người đều làm. Không muốn điều này nghe như tôi viết mã cho lập trình viên LCD, nhưng tôi nghĩ về việc ai đó có kinh nghiệm COBOL giới hạn, có lẽ một người đến từ ngôn ngữ khác và đã lang thang hoặc bị đẩy vào COBOL, cách họ có thể xem mã.Công cụ sửa đổi tham chiếu không phải là cú pháp so sánh được với SUBSTRING, nhưng có vẻ trực quan hơn một chút. – Kennah

+0

'WITH POINTER' Tôi đồng ý rằng ít sử dụng, hoặc sẽ biết cách sử dụng :-) Tuy nhiên, nó có nên giữ nguyên như thế không? Hãy nâng màn hình LCD lên. Việc sử dụng nó có thể được nhận xét. Ưu điểm của STRING so với sửa đổi tham chiếu là trình biên dịch trông sau các trường kích thước, chứ không phải là trình lập trình làm như vậy (hoặc không). Những cách khác để làm điều đó. Hãy nhớ rằng, nhiều người tìm kiếm, hoặc thực hiện, 'COMPUTE' phức tạp là tốt :-) –

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