【问题标题】:looping over macro variables in datastep在数据步骤中循环宏变量
【发布时间】:2019-04-29 10:54:44
【问题描述】:

我需要在我的数据步骤中循环一些宏变量 我试图定义宏变量并动态构建它们 像这样的数据步骤

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 中似乎并不那么简单。

【问题讨论】:

    标签: sas sas-macro


    【解决方案1】:

    symput的反义词是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;
    

    【讨论】:

      【解决方案2】:

      使用 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;
      

      但是,如果您需要数据集变量中的值,请将它们存储在数据集中而不是宏变量中。例如,您可以在 SET 语句中使用 POINT= 选项来选择要读取的观察结果。

      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;
      

      【讨论】:

      • 我的解决方案的改动很小。
      • @lee 是的。我进一步充实了它,添加了如何避免使用宏变量的示例。
      • 你是对的,但他给出的代码只是一个例子。大多数情况下,它来自一个比较晦涩的程序,它对其他问题有很大的改变。
      • 没错。大多数宏“数组”的使用都是编码走错路的例子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多