2015-06-18 2 views
3

У меня следующий набор данныхSAS динамический вызов symput с неизвестным количеством полей в наборе данных

data parm2; 
    input a b c d e; 
    datalines; 
1 2 3 4 A 
; 
run; 

задачи1: Я хотел бы иметь набор макропеременными. Предположим, что я не знаю числа полей и его соответствующего имени поля.

Проблема2: поля не одинаковые.

требуемая операция, как следующее:

data _null_; 
    set parm2; 
call symput('a',a); 
call symput('b',b); 
call symput('c',c); 
call symput('d',d); 
call symput('e',e); 
run; 

%put &a; 
+0

Посмотрите на звонок vnext. Когда у меня будет время позже, я отправлю решение, если кто-то еще этого не сделал. – Reeza

+0

Привет @Reeza, мне нужно использовать do loop? и поля имеют различный тип данных – useR

ответ

5

Если это структура данных, я бы транспонировать:

proc transpose data=parm2 out=parmt; 
    var _all_; 
run; 

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

data _null_; 
    set parmt; 
    call symput(_name_,col1); 
run; 
+0

Что произойдет, если у вас есть символьные и числовые переменные? – Reeza

+0

@Reeza Теперь он сделает то и другое. – DWal

+0

@DWai Спасибо !!! – useR

0

[Отредактировано: некоторые c оды или строки кода, отмеченные *, как ОП не требует его]

Используйте proc sql словарь, чтобы получить имя переменной, содержащейся в вашем datase с использованием Memname и libname спецификации.

Использовать data step для получения переменных в переменной marco. Имя переменных хранится под именем столбца name, поэтому мы должны указать его как call symputx('variable ' !! left(_n_), **name**);. Функция макропеременной Total заключается в том, чтобы указать количество переменных, существовавших в вашем наборе данных.

Теперь вы бы variable1 = а, variable2 = б ....

%macro definevar (library, dataset); 
proc sql; 
create table Attribute as 
select * from dictionary.columns; 
where memname = upcase(&dataset) and libname = upcase(&library); 
quit; 

data letmacro; 
set Attribute end=end; 
call symputx('variable ' !! left(_n_), name); 
* if end then call symputx (Total, _n_); 
run; 



/* 
***** extra ******** 
data _null_; 
set &dataset ; 
%do i=1 to &total; 
    call symputx ("var&i" !! left(_n_), &&variable&i); 
%end; 
run; 
***** extra ******** 
*/ 

%mend definevar; 

%definevar(ifanylibrary, parm2) 

И я с нетерпением жду, чтобы узнать ЗВОНИТЕ решение VNEXT по @Reeza

2

после некоторых исследований я нашел следующее решение. Хотя это не идеальный вариант, но стоит поделиться. Глядя вперед @Reeze ответить

data _null_; 
    set parm2; 
    array t(*) _numeric_; /*this deal with different data type*/ 
    do i = 1 to dim(t); 
     call symput(vname(t[i]), t[i]); 
    end; 
    array t2(*) _character_; 
    do i = 1 to dim(t2); 
     call symput(vname(t2[i]), t2[i]); 
    end; 
run; 
1

Вот решение вызовов VNEXT с VVALUEX, если вы не имеете переменный, которая имеет такое же имя, как и автоматические переменное это, кажется, работает. Выведенное решение от SAS Примечание: http://support.sas.com/kb/24/798.html

data parm2; 
    input a b c d e $; 
    datalines; 
1 2 3 4 A 
; 
run; 


data _null_; 
    set parm2; 
    length name $32; 

*temporarily set name to not missing to start loop; 
    name='blank'; 
    do while(name ne " "); 
    call vnext(name); 

    /* Omit automatic variables, and variables created in this step only */ 
    if trim(name) not in('list','name','flag','i',' ','_ERROR_','_N_') then 
     call symput(name, vvaluex(name)); 

    end; 
run; 

%put &a; 
%put &b; 
%put &c; 
%put &d; 
%put &e; 
+0

Выглядит хорошо, но так, как вы его написали, цикл никогда не начинается, потому что 'name' инициализируется отсутствующим. Дайте ему другую стартовую ценность, и она должна работать. – DWal

+0

Комментарий дал вам знать, что;) – Reeza

+0

Ха, я полностью пропустил это. – DWal

Смежные вопросы