2016-02-23 3 views
3

У меня есть набор входных макропеременных в SAS. Они являются динамическими и генерируются на основе выбора пользователя в сохраненном процессе sas.Получить значения переменных макроса в таблице SAS

For example:There are 10 input values 1 to 10. 
The name of the macro variable is VAR_. If a user selects 2,5,7 then 4 macro variables are created. 
&VAR_0=3; 
&VAR_=2; 
&VAR_1=5; 
&VAR_2=7; 

Первый с суффиксом 0 обеспечивает подсчет. Следующие 3 дают значения.

Примечание: Если пользователь выбирает только одно значение, тогда создается только одна макропеременная. Например, если пользователь выбирает 9, то & var_ = 9; будут созданы. Не будет никакой макрокоманды count. Я пытаюсь создать таблицу sas, используя эти переменные.

Это должно быть, как это

OBS VAR 
----------- 
1  2 
2  5 
3  7 
----------- 

Это то, что я пытался. Не уверен, что это правильный способ сделать это. Это не дает мне окончательного решения, но я могу, по крайней мере, получить имя макропеременных в таблице. Как я могу получить их ценности?

data tbl1; 
do I=1 to &var_0; 
VAR=CAT('&VAR_',I-1); 
OUTPUT; 
END; 
RUN; 
PROC SQL; 
CREATE TABLE TBL2 AS 
SELECT I, 
CASE WHEN VAR= '&VAR_0' THEN '&VAR_' ELSE VAR END AS VAR 
from TBL1; 
QUIT; 

Благодарим за помощь.

Jay

ответ

0

Я не понимаю вашу схему нумерации и рекомендуем изменить его, если вы можете; переменная &var_ очень запутанна.

В любом случае, самый простой способ сделать это - SYMGET. Это возвращает значение из таблицы макрокоманд, которое вы можете указать во время выполнения.

%let VAR_0=3; 
%let VAR_=2; 
%let VAR_1=5; 
%let VAR_2=7; 

data want; 
    do obs = 1 to &var_0.; 
    var = input(symget(cats('VAR_',ifc(obs=1,'',put(obs-1,2.)))),2.); 
    output; 
    end; 
run; 
+0

Шаблон переменной выглядит так, как веб-интерфейс от SAS возвращает выбор пользователя. Я также видел, где он просто возвращает одну переменную и вообще не создает переменную '_0'. – Tom

+0

@ Тома Хм, это очень странно. Почему «первым» будет '& var_', а не' & var_1' ?? – Joe

+0

Не уверен, я предположил, что логика прошла так. Если вы определяете поле как MONTH и не выбираете multi-select, тогда получите переменную MONTH. Поэтому они хотели также вернуть переменное имя MONTH, когда оно является мульти-select. Я не смотрел на нее в течение многих лет, но я думал, что это сделал как МЕСЯЦ, так и МЕСЯЦ1. Но, возможно, это был мой код, который добавил MONTH1, поскольку он казался таким странным. – Tom

1

SAS услужливо хранит их в таблицу для вас уже, вам просто нужно разобрать те, которые вы хотите. Таблица называется SASHELP.VMACRO или DICTIONARY.MACROS

Вот пример:

%let var=1; 
%let var2=3; 
%let var4=5; 

proc sql; 
create table want as 
select * from sashelp.vmacro 
where name like 'VAR%'; 
quit; 

proc print data=want; 
run; 
+0

Thank You Reeza. Отлично. Ценю вашу помощь. – learnlearn10

1

Я думаю, что настоящая проблема заключается в несогласованном поведении хранимого процесса. Он создает только переменную 0 и 1, если имеется несколько вариантов выбора. Я думаю, что ваш пример немного. Если значение VAR_0 равно трем, то они должны быть макрокомандой VAR_3. Также должно быть установлено значение VAR_ и VAR_1.

Чтобы исправить это в прошлом, я сделал что-то подобное. Сначала дадим имя параметра макрокоманде, чтобы код был повторно использован для других программ.

%let name=VAR_; 

Затем сначала убедитесь, что существуют минимальные макропеременные.

%global &name &name.0 &name.1 ; 

Затем убедитесь, что у вас есть счетчик, установив переменную 0 в 1, когда она пуста.

%let &name.0 = %scan(&&&name.0 1,1); 

Затем убедитесь, что у вас есть 1 переменные. Так как он должен иметь то же значение, что и макро переменная без суффикса, просто повторно назначьте его.

%let &name.1 = &&&name ; 

Теперь ваш шаг данных проще.

data want ; 
    length var $32 value $200 ; 
    do i=1 to &&&name.0 ; 
    var=cats(symget('name'),i); 
    value=symget(var); 
    output; 
    end; 
run; 
Смежные вопросы