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

扫描宏变量中的值,并使用SAS将其存储在数据集中的列中,sas,sas-macro,Sas,Sas Macro,输出: 表1 Col1 234.34 C56.67 2345.67 C67.56 这是一个错误,有人能告诉我: %let abc = ("234.34", "C56.67", "2345.67", "C67.56") ; 您不需要一个宏和一种方法来实现这一点 %macro generate ; %local i ; data table1; length Col1 $100.; %do i=1 %to %sysfunc(countw(&abc.

输出: 表1

Col1

234.34

C56.67

2345.67

C67.56

这是一个错误,有人能告诉我:

%let abc = ("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;

您不需要一个宏和一种方法来实现这一点

%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;
一种proc-sql方法

%let abc=(“234.34”、“C56.67”、“2345.67”、“C67.56”)

它将扫描由“
”、“
”分隔的宏,并在每个循环中按1前进

%let abc=(“234.34”、“C56.67”、“2345.67”、“C67.56”)


它将扫描以“
”、“
”分隔的宏,并在每个循环中按1前进。

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

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;
如果值不包含
()
,则您也可以使用
%scan(&abc,1,())
,这还有一个优点,即无论原始值是否包含
()

或者只需从值中删除
()
,并在需要宏变量的地方使用宏变量时将其添加回去

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

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

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;
如果值不包含
()
,则您也可以使用
%scan(&abc,1,())
,这还有一个优点,即无论原始值是否包含
()

或者只需从值中删除
()
,并在需要宏变量的地方使用宏变量时将其添加回去

%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(%superq(abc),&I,%str(,)
?我尝试过使用下面的代码,它也无法工作数据表1;长度1.100美元。;i=1到%sysfunc(countw(&abc.));Col1=%scan(&abc.,&i.,“sq”);产出;结束;跑或者,
创建表tab1(col1 varchar(32));插入tab1值(%scan(%superq(abc),&i,%str(,)首先创建空白表,并用Do-while循环插入值。这是问题,我把ABC作为一个标准宏从一个过程中,我不能改变为什么你使用宏循环而不是数据步进循环?尝试一下,它会工作得很好。您是否尝试过
%scan(%superq(abc),&I,%str(,)
?我尝试过使用下面的代码,它也无法工作数据表1;长度1.100美元。;i=1到%sysfunc(countw(&abc.));Col1=%scan(&abc.,&i.,“sq”);产出;结束;跑或者,
创建表tab1(col1 varchar(32));插入tab1值(%scan(%superq(abc),&i,%str(,)首先创建空白表,并用Dewhile while循环插入值。这是问题,我将ABC作为一个标准宏从一个过程中得到,我不能改变它。