#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. Это невероятно.