перебирая макропеременные в шаге данных - PullRequest
0 голосов
/ 29 апреля 2019

Мне нужно перебрать некоторые макропеременные в моем шаге данных я попытался определить макропеременную и построить их динамически в шаг данных, как это

DATA _NULL_;
 call symputx('_rbank_1',put(001,z3.));
 call symputx('_rwebhost_1','company1.myhost.com');

 call symputx('_rbank_2',put(008,z3.));
 call symputx('_rwebhost_2','company2.myhost.com');

 call symputx('_rbank_3',put(008,z3.));
 call symputx('_rwebhost_3','company3.myhost.com');

RUN;

%let _rbank_1 = &_rbank_1;
%let _rwebhost_1 = &_rwebhost_1;
%let _rbank_2 = &_rbank_2;
%let _rwebhost_2 = &_rwebhost_2;
%let _rbank_3 = &_rbank_3;
%let _rwebhost_3 = &_rwebhost_3;


data test;
 do cnt=1 to 3;
  macroString=compress("&_rwebhost_"||cnt);
  marcroValue=macroString; 
 end;
run;

Но вывод macroValue - "& _rwebhost_3", и мне это нужно быть значением, а не именем.

Я могу сделать это в макросе, но мне действительно нужно это в шаге данных. Обычно на другом языке программирования я бы определил хеш-таблицу но это не так просто в sas datastep.

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Опозит симпута - это symget

data test;
 do cnt=1 to 3;
  macroString=symgetc(cats("_rwebhost_",put(cnt,BEST32.)));
  marcroValue=symgetn(cats("_rbank_",put(cnt,BEST32.)));
  output; 
 end;
run;
0 голосов
/ 29 апреля 2019

Используйте функцию SYMGET (), чтобы получить значение макропеременной, имя которой заранее неизвестно.

%let _rbank_1 = 001;
%let _rwebhost_1 = company1.myhost.com;
%let _rbank_2 = 008;
%let _rwebhost_2 = company2.myhost.com;
%let _rbank_3 = 008;
%let _rwebhost_3 = company3.myhost.com;

data test;
 do cnt=1 to 3;
   bank = symget(cats('_rbank_',cnt));
   webhost= symget(cats('_rwebhost_',cnt));
   put cnt= bank= webhost= ;
 end;
run;

Но если вам нужны значения в переменных набора данных, сохраните их в наборе данных.из макропеременных.Например, вы можете использовать опцию POINT = в операторе SET, чтобы выбрать, какое наблюдение читать.

data company ;
  input bank $3. webhost $20. ;
cards;
001 company1.myhost.com
008 company2.myhost.com
008 company3.myhost.com
;

data test;
  do cnt=1 to 3;
    set company point=cnt;
    put cnt= bank= webhost= ;
  end;
run;
...