2015-08-16 128 views
0

我有一個關於解決SAS中宏變量的問題。我有以下代碼,這是一個更大塊的簡化版本。出於實際原因,我無法更改代碼的結構。解決SAS中的宏變量問題

%let a = x1 x2 x3; 
%let b = y1 y2 y3; 
%let c = a b; 


%macro test (input); 
    %local i; 
    %let string_c = %str(&input); 
    %do i=1 %to 2; 
     %put &%qscan(&string_c, &i); /* ? */ 
    %end; 
%mend test; 

%test(&c); 

在步驟?以上,我想解決A和B作爲宏觀變量和有系統打印出

x1 x2 x3 

然後

y1 y2 y3 

然而,上面的代碼不reslove A和B作爲宏觀變量和系統打印出來

&a 
&b 

我想知道是否有解決這個問題的辦法。

非常感謝!

回答

1

試試這個:

%let a = x1 x2 x3; 
%let b = y1 y2 y3; 
%let c = a b; 

%macro test (input); 
    %local i; 
    %let string_c =%str(&input); 
    %do i=1 %to 2; 
     %put %unquote(&&%qscan(&string_c, &i)); 
    %end; 
%mend test; 

%test(&c); 
+1

有趣的答案。你可以添加一些解釋爲什麼這會起作用,特別是爲什麼%unquote()在這裏很有用,即使你用%str()和%qscan()刪除了引用。例如,它有助於這個簡單的測試案例: %macro x; x%修補; %let x = 1; %put%unquote(&&%x); – Quentin

+0

謝謝Shenglin。它的工作原理!後續問題類似於Quentin的原因:) – frostman

+0

沒有%unquote,SAS將a/b解釋爲文本加上&,而不是宏變量&a/&b,使用%unquote,強制將&和a/b粘合在一起並恢復值的正常標記。 –

0

該&觸發器是解析一個名稱,但您已經跟隨另一個宏觸發%而不是名稱。所以它什麼都不做。將名稱分配給宏變量然後對其進行評估會更容易。

%macro test(list); 
    %local i varname value; 
    %do i=1 %to %sysfunc(countw(&list,%str())); 
    %let varname=%scan(&list,&i,%str()); 
    %let value=&&&varname ; 
    %put The value of "&varname" is "&value" ; 
    %end; 
%mend test; 
%let a=One ; 
%let b=Two ; 
%test(a b); 

導致:

The value of "a" is "One" 
The value of "b" is "Two" 
+0

謝謝你,湯姆。我的問題是,我必須保持代碼的結構,以實用但不合理的理由:)。因此,我必須解決循環中的宏變量a和b。 – frostman

+0

那麼這與我發佈的例子有什麼不同呢?它解決了宏變量A和B.如果您首先將列表中的名稱解析爲新的宏變量,然後使用&& mvar語法來解析MVAR中命名的變量的值,那麼它就更容易管理。 – Tom

+0

謝謝,湯姆。是的,我同意,如果我們在宏中實際定義「a」和「b」,而不是從一開始就更容易管理。然而,由於現有的政策,我必須在一開始就定義a和b,所以我的手完全緊盯在我正在編寫的代碼中......萬歲官僚主義:) – frostman