Как я могу объединить пробел с помощью функции CATX?

#sas #sas-macro

#sas #sas-макрос

Вопрос:

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

Я пробовал это 5 способами, но это не дало желаемого результата.

 %LET lim1 = 113;
%LET lim2 = 166;
  

Тест 1:

 %LET linha = %SYSFUNC(CATS(De,amp;lim1,a,amp;lim2,clientes));
%PUT amp;linha;
  

Выход 1:

 De113a166clientes
  

Тест 2:

 %LET linha = %SYSFUNC(CATS('De ',amp;lim1,' a ',amp;lim2,' clientes'));
%PUT amp;linha;
  

Выход 2 (ошибка):

 30         %LET linha = %SYSFUNC(CATS('De ',amp;lim1,' a ',amp;lim2,' clientes'));
NOTE: Line generated by the macro function "SYSFUNC".
30          'De '113' a '166' clientes'
            _____   _____
            49      49
NOTE 49-169: The meaning of an identifier after a quoted string might change in a future SAS release.  Inserting white space 
             between a quoted string and the succeeding identifier is recommended.
             
  

Тест 3:

 %LET linha = %SYSFUNC(CATX(' ','De ',amp;lim1,' a ',amp;lim2,' clientes'));
%PUT amp;linha;
  

Выход 3 (ошибка):

 29         %LET linha = %SYSFUNC(CATX(' ','De ',amp;lim1,' a ',amp;lim2,' clientes'));
NOTE: Line generated by the macro function "SYSFUNC".
29          'De '' '113' '' a '' '166' '' clientes'
            ________   ___________
            49         49
NOTE 49-169: The meaning of an identifier after a quoted string might change in a future SAS release.  Inserting white space 
             between a quoted string and the succeeding identifier is recommended.
  

Тест 4:

 %LET linha = %SYSFUNC(CATX(' ',De,amp;lim1,a,amp;lim2,clientes));
%PUT amp;linha;
  

Выход 4 (ошибка):

 NOTE: Line generated by the macro function "SYSFUNC".
29          De' '113' 'a' '166' 'clientes
              ___   ___ ___   ___
              49    49  49    49
NOTE 49-169: The meaning of an identifier after a quoted string might change in a future SAS release.  Inserting white space 
             between a quoted string and the succeeding identifier is recommended.
  

Тест 5:

 %LET linha = %SYSFUNC(CATX(*,De,amp;lim1,a,amp;lim2,clientes));
%PUT amp;linha;
  

Выход 5:

 De*113*a*166*clientes
  

Тест 5 настолько близок, насколько мне нужно, но мне нужно заменить * пробелом.

Мне нужно: De 113 a 166 clientes

К сожалению, я не добился успеха.

Ответ №1:

В макросе вам не нужно использовать CAT для сборки текста исходного кода.

Просто разрешите макропеременные в желаемом контексте.

 %LET lim1 = 113;
%LET lim2 = 166;
%LET linha = De amp;lim1 a amp;lim2 clientes;
%PUT amp;=linha;
----- LOG -----
LINHA=De 113 a 166 clientes
  

При использовании значения переменной макроса в контексте шага ДАННЫХ для вычисления строки в кавычках или строкового значения разрешение должно быть в двойных кавычках строкового литерала (если значение макроса уже не является буквальным текстом в двойных кавычках)

 data have;
  input (part1-part3) ($);
datalines;
De a clientes
Si o consumer
Mr A Sky
;
%LET lim1 = 113;
%LET lim2 = 166;

data want;
  set have;
  result = catx(' ', part1, "amp;lim1", part2, "amp;lim2", part3);
  put result=;
run;
----- LOG -----
result=De 113 a 166 clientes
result=Si 113 o 166 consumer
result=Mr 113 A 166 Sky

  

Комментарии:

1. Это невероятно.