扫描宏变量中的值并使用SAS将其存储在数据集的列中

时间:2018-02-12 15:58:43

标签: sas sas-macro

%let abc = ("234.34", "C56.67", "2345.67", "C67.56") ;

输出: 表1

Col1中

234.34

C56.67

2345.67

C67.56

这是一个错误,有人可以指导我:

%macro generate ;


    %local i ;

    data table1;

    length Col1 $100.;

    %do i=1 %to %sysfunc(countw(&abc.));

          Col1 = %scan(&abc., &i.,,"sq");
          output;

     %end;
    run;

%mend;

%generate;

3 个答案:

答案 0 :(得分:2)

你不需要宏和一种方法来做到这一点。

%let abc = ("234.34", "C56.67", "2345.67", "C67.56" );
%let abc = %qsysfunc(compress(&abc,%str(%"%)%()));
data table1;
length Col1 $100.;
do i = 1 to countw("&abc", ","); 
Col1 = scan("&abc", i,','); 
output; 
end;
run;

答案 1 :(得分:0)

proc sql方式

%let abc = ("234.34", "C56.67", "2345.67", "C67.56") ;

proc sql;
create table tab1 (col1 varchar(100));
quit;

options macrogen mlogic;

%macro gen;
%let i = 1;
%do %while (%scan(%superq(abc),&i,%str(,)) ne %str( ));

proc sql;
insert into tab1
values(%scan(%superq(abc),&i,%str(,)));
quit;

%let i = %sysevalf(&i + 1);
%end;

%mend gen; %gen;

它将扫描由","分隔的宏,并在每个循环中前进1。

答案 2 :(得分:0)

您可以使用DO循环执行此操作,但您需要从宏变量的值中删除()

%let abc = ("234.34", "C56.67", "2345.67", "C67.56") ;
data table1;
  length Col1 $100.;
  do Col1 = %substr(&abc,2,%length(&abc)-2);
    output;
  end;
run;

如果值不包含(),那么您也可以使用%scan(&abc,1,()),这也有利于原始值是否具有封闭()的工作。

或者只是从值中删除(),并在需要使用宏变量时将其添加回来。

%let abc = "234.34", "C56.67", "2345.67", "C67.56" ;
...
  do Col1 = &abc ;
...
  where dxcode in (&abc) 
....