2014-11-28 4 views
1

그래서 내 입력 파일은 같은 것 : 지금결과로 다른 작업과 함께, 다른 기록에 인스턴스가 동일한 텍스트를 찾기

words words nothing important 

words words nothing important 

the quick brown fox 23 

the quick brown fox 14 

words words nothing important 

words words nothing important 

, 나는 "여우의 첫 번째 인스턴스를 잡을 수 있도록하고 싶습니다 WS-FIRST에서 "23"을 캡처 한 다음 "여우"의 두 번째 인스턴스를 가져 와서 WS-SECOND에서 "14"를 캡처합니다.

"빠른 갈색 여우"를 다른 문자열로 바꾸 겠지만 두 줄 모두 동일하므로 매우 쉽습니다.

텍스트는 내용이 고정되어 있으며 위치가 고정되어 있으며 내용, 위치 및 길이도 고정되어 있습니다.

+0

입력 내용이 고정 된 형식인지, 찾고자하는 데이터가 가변적으로 위치 할 수 있습니까? –

+0

위치가 고정 될 때까지 입력이 고정되지 않습니다. 그러나 숫자 *가 변경 될 수 있습니다. 따라서 나중에 번호를 별도의 WS로 옮겨야합니다. – Jon

답변

0

문제는 유한 상태 기계 또는 간단한 파서에 잘 맞을 것으로 판단됩니다. 숙제처럼 들리므로 코드를 작성하지는 않겠지 만 올바른 방향으로 안내 할 수있는 몇 가지 힌트를 제공 할 것입니다.

  • 입력 한 문자를 char 루프로 처리하고 단어를 스캔하라는 강한 요구에 저항하십시오.
  • 가장 긴 리터럴에 입력 한 내용을 먼저 비교하면 "빠른 여우"가 "여우"앞에 부딪 칠 것입니다. 이것을 "탐욕스러운"스캐닝이라 부르며 일반적으로 항상 그래야하는 것은 아닙니다.
  • 검색에서 대소 문자를 구분하지 않으면 대문자와 소문자를 사용하여 입력을 접을 수 있습니다
  • 리터럴과 비교할 때 첫 번째를 조건으로 사용하면이 대신에 컴파일러 오류가 발생하기 쉽습니다 나는 그 중 일부는 도움이되기를 바랍니다

    Perform Read-An-Input-Line 
    Perform until no-more-input 
    
        Perform varying II from 1 by 1 
        until II > length of Input-Line 
    
        Evaluate true 
         when 'the quick brown fox' = function lower-case(Input-Line (II:)) 
          ...do replace for that string... 
    
         when 'fox' = function lower-case(Input-Line (II:)) 
          Move Input-Line (II + 5 : 2) to WS-Got-A-Number 
    
        End-Evaluate 
    
        End-Perform 
    
        Perform Read-An-Input-Line 
    End-Perform 
    

    : 같은 경우와 언어

에 미묘한 버그가 그래서 메인 보면 보일 수 있습니다.

+0

답변을 주셔서 감사합니다 .. 아주 잘 설명해 드리겠습니다. 나는 그 장면을 확실히 할 것입니다. 왜 내가 단어를 스캔 할 충동에 저항하는지 궁금합니다. 입력 파일은 * 아마도 * 숫자 이외의 변경되지 않는 매개 변수입니다. 더 명확히 말하면 "빠른 갈색 여우"는 실제로 날짜이며 그 숫자는 해당 날짜의 마이너스 값입니다. – Jon

+0

It '빠른 갈색 여우'는 절대로 발견 할 수 없으므로 테스트의 참조 수정에 해당 텍스트의 길이를 포함시켜야합니다. 그것은 같은 이유로 '여우'를 결코 찾지 못할 것입니다. 거짓 히트를 고려하지 않은 채, 리터럴을 공간으로 묶어야합니다 (그리고 테스트에서 리터럴의 길이를 늘려야합니다). fox 검색은 입력 행을 변경하지 않는다고 가정합니다. 루프 종료는 또한 실패 또는 잘못된 검색으로 이어질 수있는 "범위를 벗어남"을 의미합니다. –

+0

참고 mod에 길이가 필요하지 않습니다. 즉, 리터럴을 먼저 삽입해야하는 이유 중 하나인데, 컴파일은 첫 번째 인수의 길이까지 비교됩니다. 어쨌든, 그것은 매우 psuedo-code-y입니다. 돈을받지 않으면 숙제를하지 않습니다 .-) –

1
01 field-we-are-about-to-change. 
    05 FILLER. 
     10 the-bit-you-want-to-change PIC X(length of that text, you count). 
      88 its-the-text-we-want VALUE ' the quick brown fox '. 
     10 our-numeric-value PIC XX. 
     10 FILLER PIC X(what is left of the input line). 

01 WS-FIRST PIC XX. 
01 WS-SECOND PIC XX. 
01 FILLER PIC X VALUE "N". 
    88 first-not-found VALUE "N". 
    88 first-found VALUE "Y". 

MOVE your-input TO field-we-are-about-to-change 

IF its-the-text-we-want 
    MOVE replacement-text TO the-bit-you-want-to-change 
    IF first-not-found 
     SET first-found TO TRUE 
     MOVE our-numeric-value TO WS-FIRST 
    ELSE 
     MOVE our-numeric-value TO WS-SECOND 
    END-IF 
END-IF 

입력 내용이 고정되어 있으면 정의를 사용하여 고정 된 것으로 처리하십시오. 다양한 변형이 가능합니다.

+0

좋아,이게 완벽한 감각을 만든다. 그러면 다른 IF 문에서 첫 번째로 발견 된 값을 사용하여 WS-SECOND .. pefecto! – Jon

+0

@ 존 첫 번째 테스트에서 회수 한 값을 테스트로 사용하지 않았습니다. 데이터가 신뢰할 수 있다면 가능합니다. WS-FIRST를 초기 값으로 설정하면 사용자가 선택한 필드가 항상 그 값을 가질 위험이 있습니다. 오케이. 오타를 발견하고 편집하는 중 ... –