%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;
答案 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)
....