2014-08-27 3 views
5

따옴표로 묶인 매크로 변수 두 개를 연결하려고하는데 쉬운 방법이 아닌 것 같습니다.따옴표로 묶인 매크로 변수를 연결하십시오.

%LET VAR1="This is not the greatest song in the world"; 
%LET VAR2="this is just a tribute."; 

%LET TRIBUTE=%SYSFUNC(CATX(%STR(),&VAR1,&VAR2)); 
%PUT &TRIBUTE; 

가 실제로 원하는 :

"This is not the greatest song in the world this is just a tribute." 

그러나 위의 코드는 실제로 산출 :

은 우리가 말

"This is not the greatest song in the world" "this is just a tribute." 

그래서 내가 %QUOTE(), %BQUOTE 등을 넣어보십시오. 따옴표를 unmasking 희망에 &VAR1%VAR2 주위에 있지만 같은 결과가 얻을. 나를 위해 작동

있는 유일한 방법은 다음과 같습니다

%LET TRIBUTE="%SUBSTR(&VAR1.,2,%LENGTH(&VAR1.)-2) %SUBSTR(&VAR2.,2,%LENGTH(&VAR2.)-2)"; 

을하지만이 못생긴 정말 빠른 긴 얻을 수 있습니다. 더 좋은 방법이 없습니까?

답변

2

COMPRESS를 사용하여이 작업을 수행 할 수 있습니다.

%LET VAR1="This is not the greatest song in the world"; 
%LET VAR2="this is just a tribute."; 


%let VAR3=%sysfunc(compress(&VAR1,%str(%"))); 
%put &=var1 &=var3; 

따옴표를 제거하는 것은 약간 까다 롭지 만 작동합니다.

또한 FCMP 함수 또는 함수 스타일 매크로에서이 작업을 수행 할 수 있습니다. 여기 한 가지 예가 있습니다.

%macro unquote_string(string=); 
%sysfunc(compress(&string.,%str(%'%"))) 
%mend unquote_string; 

%let VAR3="%unquote_string(string=&var1.) %unquote_string(string=&var2.)"; 
%put &=var3.; 

매크로 함수를 연결하는 데 CAT 함수를 사용하지 마십시오. 그것들은 텍스트 일 ​​뿐이므로 하나씩 입력하면 자동으로 연결됩니다.

그러나 '더 좋은 방법이 있습니까?'라는 질문에 대한 실제 답변은 매크로 변수에 따옴표를 저장하지 않는 것입니다. 대부분의 경우 매크로 변수를 w/o 따옴표로 저장하고 필요할 때 따옴표 안에 사용해야합니다. SAS 매크로는 따옴표를 특별한 것으로 간주하지 않습니다. 매크로는 문자열의 문자이기 때문에이를 처리 할 특정 도구가 없습니다.

+0

두 가지 ... 첫째로 - 나는 '& ='구문에 대해 몰랐습니다 - 고마워요! 둘째로, '% let VAR3 = "% unquote_string (string = & var1 & var2.)"; 로의 var3 할당을 단순화 할 수 있습니다. –

+0

그런 식으로 절대적으로 단순화 할 수 있습니다. 위와 같은 것이 조금 더 마음에 들지만, 따옴표를 없애는 것이 더 명확합니다. 일종의'% UNQUOTE'가 매크로 따옴표만큼이나 작동하는 것과 같습니다. (매크로 따옴표로 묶인 mvars라면 두 번 호출해야한다고 생각합니다.) – Joe

+0

사실, 이제 생각해 보았습니다. FCMP 함수 나 매크로 함수를 만들 때의 나쁜 예가 될 것입니다. 기존 함수를 호출하기 만하면됩니다 ... 그냥 함수를 직접 호출 할 수도 있습니다. . –

4

Joe의 '진짜 대답'은 말하자면 매크로 변수에 따옴표를 저장하지 마십시오. 매크로 언어의 작은 따옴표와 큰 따옴표는 다른 문자와 다를 바 없습니다. 당신이해야 할 일은 실제로 필요할 때까지 따옴표를 사용하는 것을 지연시키는 것입니다. 이렇게하면 더 깔끔하고 유연하며 읽기 쉽고 버그가없는 코드가됩니다.

코드 :

공지 사항 내가 따옴표를 제거했습니다 난 그냥 그들에게 하나씩 나열하고있어 문자열을 연결하는 :

%LET VAR1=This is not the greatest song in the world; 
%LET VAR2=this is just a tribute.; 
%LET TRIBUTE=&VAR1 &VAR2; 

예 1

첫 번째 예제에서 %put 문을 사용함에 따라 원하는 문자열을 출력하는 데 따옴표가 필요하지 않습니다.이 이유 때문에 인용 부호를 남겨 두었습니다 :

%PUT &TRIBUTE; 

출력 :

data _null_; 
    put "&TRIBUTE"; 
run; 

출력 :

우리는 데이터 단계 땅에서 지금 때문에 2

따옴표가 필요

This is not the greatest song in the world this is just a tribute. 

위의 두 예 모두 실제로 따옴표를 화면에 인쇄하지 않는다고 가정합니다.

+0

일반적으로 당신이 말한대로 매크로 변수에 따옴표를 피할 것이다. 그러나 나는 몇 가지 일반적인 사용 매크로 req 쉼표를 포함 할 수도 있고 포함하지 않을 수도있는 매개 변수. 이것은 따옴표로 붙지 않으면 위치 매개 변수 오류가 발생할 수 있습니다. 따라서 규칙에 따라이 매크로를 작성할 때마다 매개 변수를 인용해야만 안전합니다. 그런데 매크로 나 겹 따옴표의 본문을 연결하고 싶을 수도 있습니다. 여기에 제 질문이 작용합니다. – Pane

+1

당신이 설명하는 문제를 피하기 위해 쉼표를 사용하는 올바른 방법은'% bquote()'매크로 함수로 값을 감싸는 것입니다. –

+0

@Pane 사실,이 목적으로 인용 부호를 사용하면 안됩니다. – Joe

관련 문제