使用 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)
....
%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)
....