나는 COBOL뿐만 아니라이 사이트를 처음 사용합니다. 80 바이트 파일을 읽고 특정 문자열을 찾고 그 바로 뒤에있는 다른 문자열을 잡는 프로그램을 작성하려고합니다. 내가 가지고있는 유일한 문제는 문자열의 시작 위치가 파일 전체에서 항상 같은 바이트에있는 것은 아니라는 것입니다.위치를 모르는 경우 파일에서 COBOL로 문자열을 가져 오는 방법은 무엇입니까?
LENGTH(14909135) FILEID(DD:EDIREC) MSGDATE(130723) MSGDATELONG(20130723) MSGTIME(091053) MSGSEQO(001390) MSGNAME(00008557) MSGSEQNO(00001) SESSIONKEY(XXXXXXXX) DELIMITED(E) SYSNAME(XXXXX-XX) SYSLEVEL(XXXX) TIMEZONE(L) DATATYPE(E) EDITYPE(XXX) SENDERFILE(#####) RECFM(????) RECLEN(#) RECDLM(E) UNIQUEID(XXXXXXXX) SYSTYPE(##) SYSVER(#); RECEIVED ACCOUNT(XXXX) USERID(XXXXXXXX) CLASS(#E2) CHARGE(3) LENGTH(14911043) FILEID(DD:EDIREC) MSGDATE(130723) MSGDATELONG(20130723) MSGTIME(093045) MSGSEQO(001392) MSGSEQNO(00000) SESSIONKEY(XXXXXXXX) DELIMITED(C) SYSNAME(XXXXX-XX) SYSLEVEL(XXXX) TIMEZONE(L) DATATYPE(E) EDITYPE(UNFORMATTED) SENDERFILE(XXXXXXXXXXXXX) RECFM(????) RECLEN(0) RECDLM(C) UNIQUEID(XXXXXXXX) SYSTYPE(24) SYSVER(5);
주의 두 길이 (#####) 문자열 예를 들어, 내가 아래 찾기 위해 노력하고있는 문자열은 파일 전체를 두 번 표시되는 길이 (#####) 문자열입니다. 아래 코드는 길이 문자열이 나타나는 횟수를 계산하는 것은 물론 최종 길이 문자열 수 (실제로 원하는 길이 문자열 내의 수)를 가져 오지만이 두 위치에있을 때만 처리합니다.
WORKING-STORAGE SECTION. 01 WS-INPUT-RECORD PIC X(80). 01 WS-STRINGS. 05 LENGTH-STRING PIC X(7) VALUE 'LENGTH('. 01 WS-COUNTERS. 05 WS-MSG-COUNT PIC 9(11). 01 WS-CHAR-TOTALS. 05 CHAR-TOTAL PIC 9(11) VALUE ZEROS. 05 TMP-TOTAL PIC X(11) VALUE ZEROS. ...... PROCEDURE DIVISION. 2200-GET-MSG-TOTAL. INSPECT WS-INPUT-RECORD TALLYING WS-MSG-COUNT FOR ALL LENGTH-STRING. 2300-CHAR-TOTAL. IF WS-INPUT-RECORD(1:7) = LENGTH-STRING MOVE WS-INPUT-RECORD(8:9) TO TMP-TOTAL UNSTRING TMP-TOTAL DELIMITED BY ')' INTO CHAR-TOTAL END-IF IF WS-INPUT-RECORD(61:7) = LENGTH-STRING MOVE WS-INPUT-RECORD(68:9) TO TMP-TOTAL UNSTRING TMP-TOTAL DELIMITED BY ')' INTO CHAR-TOTAL END-IF
코드는 위의 예제 입력에 표시된 두 가지 위치에서 잘 작동합니다. 그러나 LENGTH (####)가 다른 바이트 위치에서 끝나면 작동하지 않습니다. 문자열에 대한 파일의 모든 바이트를 검사하는 IF 문을 코딩하는 것 외에 길이가 길어지면 그 값을 가져 오는 더 쉬운 방법이 있습니까? 다른 게시물을 많이 확인하고 포인터 또는 테이블을 사용하는 것에 대해 생각해 보았습니다.하지만 실제로 이해할 수는 없습니다.
PERFORM 코드를 사용하는 경우 최소한 하나가 있다는 것을 알고있을 때만 검색하도록 INSPECT를 포함합니다. INSPECT를 원하지 않는다면, "length of input-9"부터 시작하여 "뒤에서"루프를 수행하십시오. 가능한 가장 짧은 문자열을 얻을 수 있습니다. 최소값을 알고 있으면 수정하십시오. "해지"는 쉽습니다. 0에 도달하면 멈 춥니 다.INSPECT는 많은 프로세싱을 저장하지만, 파일 크기가 그리 크지 않기 때문에 다음과 같이 알아볼 수 있습니다. :-)하지만 적어도 다음에 복사 할 때 효율적인 코드를 얻습니다. –