#html #sas
#HTML #sas
Вопрос:
У меня есть программа SAS, которая отправляет электронное письмо с использованием HTML, но одна из папок, на которые я пытаюсь ссылаться в качестве ссылки, содержит апостроф:
%let body1 = %nrquote(
<ul>
<li><a href='\serverStudiesAlzheimer'sDocuments'>Alzheimer's Documents</a>
</ul>
) ;
Эта переменная макроса будет использоваться в следующем макросе:
%macro sas_email(to=, subject=, body1=, body2=, body3=) ;
options
emailsys=smtp
emailhost=("smtp.gmail.com" port=465) ;
filename alert email to=(amp;to.)
subject="amp;subject."
content_type="text/html"
debug ;
data _null_ ;
file alert ;
put "amp;body1." ;
%if %length(amp;body2.) > 0 %then %do ;
put "amp;body2." ;
%end ;
%if %length(amp;body3.) > 0 %then %do ;
put "amp;body3." ;
%end ;
run ;
%mend sas_email ;
Как вы можете себе представить, апостроф в Alzheimer's
вызывает проблемы. Использование двойных кавычек вместо одинарных выдает ошибку:
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric
operand is required. The condition was: %length(amp;body1.) > 0
Комментарии:
1. используйте encodeURIComponent для создания href
2. о, в вашем случае просто используйте » вместо» (это не 2 кавычки, а одна двойная кавычка)
3. в качестве альтернативы вы можете избежать его с помощью »: … zheimer ‘s Doc…
4. Я не думаю, что URL распознает обратную косую черту как означающую «escape». Они используются для разделения каталогов.
5. @jonathan Heindl ты имеешь в виду
Alzheimer"s
?
Ответ №1:
HTML не волнует, используете ли вы двойные или одинарные кавычки. Таким образом, ваш сгенерированный HTML-тег может выглядеть следующим образом:
<a href="\serverStudiesAlzheimer'sDocuments">
Если вы хотите добавить одинарные кавычки в строку, заключенную в одинарные кавычки, закодируйте ее.
<a href='\serverStudiesAlzheimer'sDocuments'>
Поскольку вы собираетесь использовать переменную макроса на шаге данных, попробуйте просто использовать %BQUOTE()
для добавления кавычек макроса при создании значения. Это должно позволить вам создать строку, которая будет выглядеть для SAS как несбалансированные кавычки.
%let body1 = %bquote(
<ul>
<li><a href="\serverStudiesAlzheimer'sDocuments">Alzheimer's Documents</a>
</ul>
) ;
%let body2=;
%let body3=;
Затем при его использовании избегайте попыток расширить макропеременную, используя symget()
функцию для извлечения значения макропеременной в фактическую переменную, которую затем можно записать с помощью PUT
оператора.
data _null_;
file alert ;
length str $32767;
do i=1 to 3;
str=symget(cats('body',i));
put str ;
end;
run;
Комментарии:
1. Двойные кавычки выдают ошибку
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required.
, а использование'
указывает на папку с именемAlzheimer's
, а неAlzheimer's
.2. Избегайте попыток использовать значение переменной макроса для генерации кода SAS вместо кода HTML. Так что избегайте
"amp;body"
. Если вам действительно нужно было сгенерировать строковый литерал SAS, попробуйте использоватьquote()
function . Нравится%sysfunc(quote(%superq(body1),%str(%')))