2014-10-13 2 views
2

내 문제는 파일에서 읽은 변수에 다른 문자열이 들어 있는지 또는 일치하는지 확인하는 것입니다. 즉 COBOL에서 문자열의 하위 문자열 찾기

, 그

BRADD PIC X (30)

을 변수

일치 또는 키보드에 의해 도입 된 문자열을 포함하는 파일에서 찾을 모든 레코드.

나는이 문제가 INSPECT 명령을 통해 해결 매우 확신, 그리고 내 코드에서 이런 식으로 뭔가를 시도했다 :

CITY 내가 키보드를 통해 소개 변수입니다
  READ BRANCHFILE NEXT RECORD 
      AT END SET EndOfFile TO TRUE 
      END-READ. 
      PERFORM UNTIL EndOfFile 
       INSPECT BBRADD 
       TALLYING CONT for CHARACTERS 
        BEFORE INITIAL CITY 
       IF CONT>1 
        DISPLAY " BRANCH CODE :" BBRID 
        DISPLAY " BRANCH NAME :" BBRNAME 
        DISPLAY " BRANCH ADDRESS :" BBRADD 
        DISPLAY " PHONE   :" BBRPH 
        DISPLAY " E-MAIL   :" BEMAIL 
        DISPLAY " MANAGER NAME :" BMGRNAME 
        DISPLAY " ------------------" 
        DISPLAY " ------------------" 
       END-IF 
       READ BRANCHFILE NEXT RECORD 
        AT END SET EndOfFile TO TRUE 
       END-READ 
       MOVE 0 TO CONT 
      END-PERFORM. 

.

¿ 누구나 "문자열"에서 "하위 문자열"을 찾는 방법을 알고 있습니까?

예를 들어, "Zaragoza"를 도입하면 내 프로그램은 BBRADD 변수에 "Zaragoza"가 포함 된 파일의 모든 레코드를 인쇄해야합니다.

01 BRANCHREC. 
    88 EndOfFile VALUE HIGH-VALUE. 
    02 BBRID PIC X(6). 
    02 BBRNAME PIC X(15). 
    02 BBRADD PIC X(30). 
    02 BBRPH PIC X(10). 
    02 BEMAIL PIC X(20). 
    02 BMGRNAME PIC X(25). 
+0

제안 된 코드를 사용하고 있습니다. CITY 변수의 길이를 계산하는 코드를 구현하는 방법을 먼저 찾아야합니다. – daniegarcia254

+0

지금은 걱정하지 마십시오. 길이를 하드 코드하여 원하는 것을 얻었는지 확인한 다음 길이를 찾는 데 이동하십시오. 원하는 작업에 적합하지 않다는 것을 알게되면 추가 작업을 수행하는 것이 중요하지 않으므로 먼저 원하는 코드를 테스트하십시오. –

+0

잘 듣고 싶습니다. 만약 도시의 길이에 문제가 있다면,'FUNCTION REVERSE ... '와'INSPECT ... TALLYING ...'을 사용하는 것이 좋습니다. cpu-straining 방법은 적지 만 일반적입니다. 문제가 있으면 다른 질문을 시작하십시오. 행운을 빕니다. –

답변

2

항상 INSPECT 전에 CONT를 0으로 설정해야합니다.

CONT는 INSPECT가 시작될 때 초기 값에서 업데이트됩니다. 첫 번째 레코드를 찾으면 모든 레코드에 CITY가있는 것처럼 보입니다.

처음에는 이상하게 보일 수도 있지만 그렇게하지 않으면 작동하는 방식이 제한 될 수 있습니다.

아, 조금 더 가까이서 보면 CONT를 초기 값으로 설정하고 있습니다. 예기치 않은 곳에서 CONT 만 설정하면됩니다. 0 일 필요가있는 경우, 0이되기 직전에 0으로 설정하십시오. 발견하기가 훨씬 쉽고, 미래에 프로그램을 변경하여 누군가가 혼란에 빠지기 쉽지 않습니다.

그러나 다른 문제가 있습니다. CITY가 PIC X (20)라고 가정 해 봅시다. 사용자가 SEVILLA를 입력하면 INSPECT가 SEVILLA와 13 개의 공백을 검색합니다. 이상적으로 당신은 SEVILLA 뒤에 하나의 공간이 올 것을 원합니다.

사용자가 입력 한 값을 후행 공백으로 테스트 할 수 있어야하지만 그 이상은 테스트 할 수 있어야합니다.

이 작업을 수행하는 현재 널리 사용되는 방법은 참조 수정입니다.

사용자 입력을 가져와 포함 된 후행 공백의 수를 계산하고, 데이터의 길이를 계산하고, 후행 공백에 하나를 추가하고, 해당 값을 필드 (바람직하게는 BINARY 필드)에 보관해야합니다.

그런 다음 당신은 다음과 같이 할 수 INSPECT : 세비야 필드의 시작 실제로 경우

  INSPECT BBRADD 
      TALLYING CONT for CHARACTERS 
       BEFORE INITIAL CITY (1 : length-of-data-plus-one) 

그러나, 당신은 문제가있다.

그래서 작은 변화를 만들고, 그 앞에 나타나는 문자를 세지 않고, 그것의 출현을 계산합니다.

  INSPECT BBRADD 
      TALLYING CONT for ALL 
          CITY (1 : length-of-data-plus-one) 

많은 사람들이 대신 참조 수정을 통해 PERFORM 루프를 코딩하고 그런 식으로 테스트를 수행합니다. 위의 INSPECT의 최종 버전에서 직접 터미네이션 로직을 코딩해야합니다. 학습 목적을 위해 두 가지 방법 모두를하는 것이 좋을 것입니다.

file-io를 수행 할 때는 항상 FILE STATUS를 사용하고 확인하십시오. 단락에 귀하의 읽기를 넣어 그것을 수행, 당신은 두 가지 코드 조각이 필요하지 않습니다. FILE STATUS 값을 수신하는 데 사용하는 필드는 파일 끝에 대해 ​​"10"이 될 것이므로 FILE STATUS를 사용하면 AT END (또는 END-READ)가 필요하지 않습니다. 해당 필드에서 88을 "10"값으로 사용하십시오.

질문에 대한 편집은 이제 기존 88 레벨의 위치를 ​​나타냅니다.

한편으로는 파일 끝이 레코드와 연관되어 있고 우발적 인 유효 컨텐츠가 없기 때문에 이는 좋은 생각입니다.

다른 한편, 이것은 "이식 가능한"솔루션이 아닙니다. 다른 COBOL을 사용하는 경우 파일 끝에 도달하면 더 이상 FD의 데이터에 액세스 할 수 없습니다. 표준에서이 상황에서 일어나는 일은 정의되지 않았으므로 컴파일러간에 차이점을 얻을 수 있습니다.

READ ... INTO ...을 사용하고 레코드 레이아웃이 WORKING-STORAGE 인 그룹 항목에 88을 보유 할 수 있습니다. 데이터를 한 위치에서 다른 위치로 전송해야하기 때문에 실행하는 데 약간 시간이 걸립니다.

필자는 FILE STATUS 필드에서 88을 선호하며 AT ENDEND-READ을 제거함으로써 READ를 단순화합니다. FD에서 기록 영역에 액세스 할 수 없으므로 실수로 잘못된 값을 얻을 수 없습니다.

+0

좋아, 이미 해봤는데 완벽하게 작동한다. 코드는 문자열에 포함 된 하위 문자열을 인식합니다. 감사합니다. – daniegarcia254