2014-04-18 3 views
1

는 I 알파 전용 단어 각각은 하나 개 이상의 공간에 의해 분리 된 임의의 수 포함될 수 매크로 varaiable의 X가 인사 : I는 다른 매크로 변수를 생성 할구분 단어

%let x = A B  CD ; 

그런 인쇄 할 때 (작은 따옴표가 큰 따옴표로 교환 할 수있다)이 결과를 줄 것이다 :

'A','B','CD' 

그것은 즉 ... in() 문에 사용합니다.

data want; 
    set have; 
    where my_field in ( /* DO SOMETHING TO &X HERE TO GIVE DESIRED OUTPUT */ ) ; 
run; 

나는 (바람직하게는 한 줄)을 찾고 있어요 순수 매크로 코드 솔루션 : 내가 이렇게 보이는 코드를 작성하는 것입니다. 이 메모를 생성하지 않습니다 하나 :

NOTE 49-169: The meaning of an identifier after a quoted string might change in a 
future SAS release. Inserting white space between a quoted string and the succeeding 
identifier is recommended. 

지금까지 나는이 있습니다

%let y = %str(%')%sysfunc(tranwrd( %sysfunc(compbl(&x)) ,%str(),%str(%',%')))%str(%'); 
%put &y; 

하지만 그 망할 노트를 제거 할 수 없습니다.

+0

왜 당신이 이렇게됩니다 매크로 언어? 이것은 나에게 데이터 조작처럼 들린다. – Joe

+0

귀하의 질문에 답변 할 수 있도록 답변이 업데이트되었습니다. '& x'의 값은 SAS에 매개 변수로 전달됩니다. –

+0

if 조건에 대해'in' 대신'indexw'를 사용할 수없고 따옴표를 많이 삽입하는 것에 대해 걱정할 필요없이 같은 결과를 얻을 수 있습니까? 아래 내 대답을 참조하십시오. – user667489

답변

3

FCMP의 경우 CATS()를 사용하여 결과 변수에 LENGTH 문을 추가해야합니다. FCMP는 문자 변수를 데이터 단계와 약간 다르게 처리합니다.

proc fcmp outlib=work.funcs.funcs; 

    function delimit_words(iString $) $; 
    length result $200; 
    result = cats("'",tranwrd(cats(compbl(iString))," ", "','"),"'");  
    return (result); 
    endsub; 

run; 

options cmplib=work.funcs; 

data _null_; 
    x = " A B C "; 
    y = delimit_words(x); 
    put y=; 
run; 

결과 :

5136 data _null_; 
5137  x = " A B C "; 
5138  y = delimit_words(x); 
5139  put y=; 
5140 run; 

y='A','B','C' 
+1

대단히 고마워요. FCMP에 대한 설명서를 가끔 읽지 말고 맹목적으로 사용하는 것보다보아야합니다. # –

0

알 수 있습니다. 트릭은 따옴표를 추가 할 때 공백을 삽입하여 단어 경계에 인접하지 않았는지 확인하는 것이 었습니다. 따라서 처음에는 문자열에 추가 공백이 채워집니다. 그런 다음 끝에 오른쪽 compress()으로 추가 공백을 제거합니다. 그렇게하면 따옴표로 묶인 문자열 식별자를 테스트 할 수 있습니다!

%let x = A B C ; 
%let y = %sysfunc(compress(%str(%')%sysfunc(tranwrd(%sysfunc(compbl(&x)), %str(), %str(%',%')))%str(%'))); 
%put &y; 

결과 :하지만 일종의 추한

'A','B','C' 

.

편집 : 두번째 시도 : 나는 속임수와 proc fcmp을 사용하십시오

생각. 최종 결과는 훨씬 좋네요 :

proc fcmp outlib=common.funcs.funcs; 

    function delimit_words(iString $) $;  
    result = "'" || tranwrd(cats(compbl(iString))," ", "','") || "'";  
    return (result); 
    endsub; 

run; 

Datastep 예 :

data x; 
    x = " A B C "; 
    y = delimit_words(x); 
    put y=; 
run; 

향상된 매크로 예 : 나는 cats()를 사용하려고하면 proc fcmp 나에게 예기치 않은 결과를주고 있었다 어떤 이유로

%let x = A B C ; 
%let y = %sysfunc(delimit_words(&x)); 
%put &y; 

함수를 사용하여 || 연결자 대신에 ||과 함께했습니다. 이 기능은 사용자가 단어 경계를 구성하는 기호와 출력을 인용할지 여부를 지정할 수있게하여 향상시킬 수 있습니다. 그렇다면 작은 따옴표 나 큰 따옴표를 사용할 것인지 여부를 결정합니다. 필요에 따라 추가하십시오.

0

변경할 경우 조건은 다음에 당신이 완전히이 문제를 피할 수 있다고 생각 대신 indexw 사용하는 경우 :

data want; 
    set have; 
    if indexw("&X",my_field) then do; 
    output; 
    end; 
run; 
+0

제안에 감사드립니다. 원래 질문에 대한 내 업데이트 된 의견을 참조하십시오. –

관련 문제