扫描功能以读取带空格前缀的字符串



我正在尝试编写一个宏,其中我的参数有多个值,其中一些值以空格为前缀。我希望能够读取字符串和空格,但是空格作为默认分隔符会导致问题。

`%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 作为下一个,然后再次读取空格,将 TRUST 读取为下一个。其中,它应该读作'ATF'作为一个字符串,'TRUST'作为第二个字符串。有人可以使用扫描功能帮助读取此类数据吗?谢谢

只需使用 %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));

尝试:

%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 个字符WHERE_P字符串,则需要更改数组行中的长度。

最新更新