функция сканирования для чтения в пространстве префиксных строк - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь написать макрос, в котором мой параметр имеет несколько значений, и некоторые из них имеют префикс пробела.Я хочу иметь возможность читать в строках вместе с пробелом, но пробел, являющийся разделителем по умолчанию, вызывает проблемы.

`%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» как секунду.Может кто-нибудь помочь прочитать в таких данных с помощью функции сканирования.Спасибо

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Просто используйте для этого функцию% 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));
0 голосов
/ 30 января 2019

Попробуйте:

%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 напрямую.

Если вы хотите разрешить строки в WHERE_P длиннее 20 символов, вам нужно изменить длину строки массива.

...