2016-11-14 5 views
0

설명 필드 (descr)에서 키워드를 검색하려고하는데 거기에 일치하는 필드 (일치하는 키워드는 중요하지 않음)가 정의되어 있으면 해당 필드를 일치로 정의합니다. do 루프가 배열의 모든 항목을 통과하는 문제가 있습니다. do 루프가 올바르지 않거나 내 index 명령이 올바르지 않기 때문에 이것이 확실하지 않습니다.배열의 SAS 인덱스

data JE.KeywordMatchTemp1; 
    set JE.JEMasterTemp; 
    if _n_ = 1 then do; 
    do i = 1 by 1 until (eof); 
    set JE.KeyWords end=eof; 
    array keywords[100] $30 _temporary_; 
    keywords[i] = Key_Words; 
    end; 
    end; 
    match = 0; 
    do i = 1 to 100 until(match=1); 
    if index(descr, keywords[i]) then match = 1; 
    end; 
    drop i; 
run; 
+0

확실히 배열의 모든 항목을 통과합니다. 왜냐하면 그렇게했기 때문입니다. 무엇을하고 싶니? 일치하는 것이 발견되면 루프를 조기에 종료하려고합니까? – Joe

+0

죄송합니다. 코드를 편집하고 클립 보드에 이전 버전이 있어야합니다. 나는 할 일이있을 때까지해야한다. –

답변

1

DO 루프에 다른 조건을 추가하여 일치가 발견되면 종료되도록하십시오. 배열에있는 항목 수를 기억하고 싶을 수도 있습니다. 또한 INDEX()이 올바르게 작동하는지 확인하십시오.

data JE.KeywordMatchTemp1; 
    if _n_ = 1 then do; 
    do i = 1 by 1 until (eof); 
     set JE.KeyWords end=eof; 
     array keywords[100] $30 _temporary_; 
     keywords[i] = Key_Words; 
    end; 
    last_i = i ; 
    retain last_i ; 
    end; 
    set JE.JEMasterTemp; 
    match = 0; 
    do i = 1 to last_i while (match=0) ; 
    if index(descr, trim(keywords[i])) then match = 1; 
    end; 
    drop i last_i; 
run; 
+0

그러나 부분적으로 작동하지만 여전히 일치하지 않습니다 (필자는 필드를 확인했으며 키워드가 있음). 내가 떨어 뜨리지 않고 마지막으로 나갈 때, 모든 행은 46과 47을 값으로 가진다. –

+1

그래서 귀하의 질문에 정말 어떻게 INDEX() 함수를 사용하는 것입니다? 대개 KEYWORDS가 30 자보다 짧아서 여분의 공백이 DESCR 변수 값이 아니므로 일치하지 않습니다. TRIM()을 추가하거나 FINDW()와 같은 다른 함수를 대신 사용하십시오. – Tom

+0

트림 해냈다 !! 고맙습니다. –

0

두 가지 문제가 있습니다. 둘 다 작고 간결한 예제에서 쉽게 볼 수 있습니다 (제안 : 향후 질문에서 이와 같은 예를 넣으십시오).

data partials; 
    input keyword $; 
    datalines; 
home 
auto 
car 
life 
whole 
renter 
;;;; 
run; 

data master; 
    input @1 description $50.; 
    datalines; 
Mutual Fund 
State Farm Automobile Insurance 
Checking Account 
Life Insurance with Geico 
Renter's Insurance 
;;;; 
run; 

data want; 
    set master; 
    array keywords[100] $ _temporary_; 
    if _n_=1 then do; 
    do _i = 1 by 1 until (eof); 
     set partials end=eof; 
     keywords[_i] = keyword; 
    end; 
    end; 
    match=0; 
    do _m = 1 to dim(keywords) while (match=0 and keywords[_m] ne ' '); 
    if find(lowcase(description),lowcase(keywords[_m]),1,'t') then match=1; 
    end; 
run; 

여기에서 살펴볼 두 가지 사항. 먼저 while에 추가합니다. 이렇게하면 문자열에 공백이 있으면 항상 일치하는 ""(와) 일치시키지 않습니다. 두 번째는 t 옵션은 find입니다. 두 인수에서 공백을 없애는 어떤 이유로 든 다른 버전이 나에게 적합하지 않은 것처럼 시작 위치에 1을 추가해야합니다. 그렇지 않으면 "auto"대신 "auto"를 찾습니다.