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

Scan values from a macro variable and store it in a column in data set using SAS

%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 0.;

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

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

     %end;
    run;

%mend;

%generate;

您不需要宏和一种方法来执行此操作。

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

一个过程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。

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

%let abc = ("234.34", "C56.67", "2345.67", "C67.56") ;
data table1;
  length Col1 0.;
  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) 
....