SAS: удалить отсутствующие элементы в макропеременной - PullRequest
0 голосов
/ 28 июня 2019

У меня есть макропеременная list1, которая дает:

%put &list1.;
A,B,C,D,,,G,,I,,

Мне нужно удалить те элементы, которые отсутствуют, то есть пустые между запятыми.Окончательный результат должен быть как A,B,C,D,G,I.Является ли это возможным?Функция обрезки здесь не работает.Я новичок в SAS, поэтому любая помощь будет оценена здесь.Спасибо.

Ответы [ 3 ]

2 голосов
/ 28 июня 2019
 %let a= A,B,C,D,,,G,,I,,;


 data c;
 val = tranwrd(trim(compbl(tranwrd("&a",","," "))), " ",",");
 call symput('b',val);
  run;

%put &b;

Это результат A, B, C, D, G, I

1 голос
/ 28 июня 2019

Вы можете преобразовать запятые в пробелы и использовать COMPBL(), чтобы свернуть несколько пробелов.Затем преобразуйте пробелы обратно в запятые.Если у вас есть пробелы, просто поменяйте местами запятую и пробел.

%let temp=%sysfunc(translate(%superq(list1),%str( ,),%str(, )));
%let temp=%sysfunc(compbl(%superq(temp)));
%let list2=%sysfunc(translate(%superq(temp),%str( ,),%str(, )));

PS Обычно вы не хотите использовать запятую в качестве разделителя в макропеременных.Это затрудняет передачу значения в другие макросы или функции, так как запятая используется для разделения значений аргумента.Отсюда все функции макросов в этом коде.Для списков переменных вы обычно хотели бы список с разделителями пробелами, где несколько соседних пробелов не имели бы значения.Для других типов списков обычно требуется другой разделитель, например | или ^.

1 голос
/ 28 июня 2019

Просто для удовольствия - версия регулярного выражения в чистых макросах:

 %let a= A,B,C,D,,,G,,I,,;
 %let regex1 = %sysfunc(prxparse(%str(s/,+/,/)));
 %let b=%sysfunc(prxchange(&regex1,-1,%quote(&a)));

 %let regex2 = %sysfunc(prxparse(%str(s/,$//)));
 %let b=%sysfunc(prxchange(&regex2,-1,%quote(&b)));

 %put b= &b;

Вы можете пропустить второе регулярное выражение, если вам никогда не приходилось сталкиваться с конечными запятыми в конце ввода.

...