#sas #sas-af
#sas #sas-af
Вопрос:
Я ищу решение проблемы, с которой сталкиваются несколько программистов, но я не могу найти никакого решения в Интернете. Вот оно:
Начиная с таблицы SAS, содержащей пары имя / значение. Пример:
varName varValue
Name Bart
Age 54
Job writer
Start 1983
Программа Scl должна прочитать содержимое таблицы и создать переменную Scl для каждой пары varName / varValue.
Должно быть легко сделать что-то подобное, но я просто не могу найти правильный способ. Это сводит меня с ума. У кого-нибудь есть решение?
Барт
Ответ №1:
Вот пример помещения 2 переменных из набора данных в список scl, который является очень хорошим контейнером для данных при использовании scl, а не неизвестного количества отдельных переменных. Не имеет значения, сколько строк в таблице, и затем вы можете использовать функции списка для доступа к данным по имени. Сохраните этот код в записи каталога sasuser.mymethods.Copytwovar2list.scl В INIT: есть тестовый пример, у вас может быть отдельная запись scl с таким использованием.
COPY_TWO_VAR_VALUES_TO_LIST:
*-----------------------------------------------------------------*
| Method Name: COPY_TWO_VAR_VALUES_TO_LIST
*--------------------------Entry Parameters-----------------------*
| d_id 8 I Input dataset id
| l_id 8 O output list
| var1 $32 I Var1 - Name of list item
| var2 $32 I Var2 - Value of item
*-----------------------------------------------------------------*;
method dsname $45
l_id 8
var1 $32
var2 $32
;
d_id=open(dsname,'i');
varnum1=varnum(d_id,var1);
vartyp1=vartype(d_id,varnum1);
if var1 ne var2 then do;
varnum2=varnum(d_id,var2);
vartyp2=vartype(d_id,varnum2);
end;
* --- fill the list with data set values;
do while(fetch(d_id) ne -1 );
i 1;
if vartyp1='C' then
u_vname=getvarc(d_id,varnum1);
else
u_vname=left(putn(getvarn(d_id,varnum1),'BEST12.'));
if var1 ne var2 then do;
if vartyp2='C' then
u_vvalue=getvarc(d_id,varnum2);
else
u_vvalue=left(putn(getvarn(d_id,varnum2),'BEST12.'));
end;
else
u_vvalue = u_vname;
rc=setitemc(l_id,u_vvalue,i,'Y');
u_vname=nameitem(l_id,i,u_vname);
end;
rc=close(d_id);
endmethod;
INIT:
* --- test example of usage ;
l_list=makelist();
call method('sasuser.mymethods.copytwovar2list.scl',
'COPY_TWO_VAR_VALUES_TO_LIST',
'sashelp.class',l_list,
'NAME',
'AGE');
call putlist(l_list,'l_list=',2);
return;