Sas 扫描函数以读取空间前缀字符串

Sas 扫描函数以读取空间前缀字符串,sas,Sas,我试图编写一个宏,其中我的参数有多个值,其中一些值是用空格预固定的。我希望能够读取字符串和空格,但空格作为默认分隔符会导致问题 `%macro ab(where_p=); data want; set have; %DO I =1 %TO %SYSFUNC(COUNTW(&WHERE_P)); %IF %LENGTH(&WHERE_P) > 0 %THEN %DO; B_&I=%SCAN(%STR(&WHERE_P),&I); %end;

我试图编写一个宏,其中我的参数有多个值,其中一些值是用空格预固定的。我希望能够读取字符串和空格,但空格作为默认分隔符会导致问题

`%macro ab(where_p=);
 data want;
 set have;
 %DO I =1 %TO %SYSFUNC(COUNTW(&WHERE_P));
 %IF %LENGTH(&WHERE_P) > 0 %THEN %DO;
 B_&I=%SCAN(%STR(&WHERE_P),&I);
 %end;
 %end;
 run;
 %mend;
 %ab(WHERE_P=" ATF" " TRUST");`
在这里,它无法按原样读取值,它将空格作为一个字符串读取,然后将ATF作为下一个字符串读取,然后再次读取空格并将信任作为下一个字符串读取。其中,应将“ATF”读作一个字符串,将“TRUST”读作第二个字符串。 是否有人可以使用扫描功能帮助读取此类数据。 谢谢

试试:

%macro ab(where_p=);
  %let array_size = %EVAL(%SYSFUNC(COUNTC(&WHERE_P, '"'))/2);
  data want;
    set have;
    array B_(&array_size) $20 (&where_p);
  run;
%mend;
%ab(WHERE_P=" ATF" " TRUST" );
首先找到项目数,即引号数除以2。 然后创建该大小的数组,并直接使用&WHERE\P赋值


如果希望允许字符串长度超过20个字符,则需要更改数组行的长度。

只需使用%SCAN()函数的功能即可处理此问题。如果数据包含分隔符,则需要引用值

%let WHERE_P=" ATF" " TRUST";
%let word1 = %scan(&where_p,1,%str( ),q);
因此,您的循环应该如下所示:

%IF %LENGTH(&WHERE_P) %THEN %DO I =1 %TO %SYSFUNC(COUNTW(&WHERE_P,%str( ),q));
   B_&I=%SCAN(&where_p,&I,%str( ),q);
%end;
...
%ab(WHERE_P=" ATF" " TRUST");`
或者可以使用数据中未显示的其他分隔符。如果要传入前导空格而不使用实际引号,则需要使用宏引号

%IF %LENGTH(&WHERE_P) %THEN %DO I =1 %TO %SYSFUNC(COUNTW(&WHERE_P,|));
   B_&I=%sysfunc(quote(%qSCAN(&where_p,&I,|)));
%end;
...
%ab(WHERE_P=%str( ATF| TRUST));

您是否尝试覆盖默认delimeter?您可以将其添加为countw函数中的第二个参数。还有,你想做什么?也许你的任务会更容易用数组来完成?这很有效,而且不需要添加数组等等。谢谢