Замена кавычек в макропеременной SAS - PullRequest
2 голосов
/ 11 ноября 2010

Рассмотрим следующий фрагмент кода sas:

%macro temp(querystr=);
  filename request temp;

  data _null_;
    file request;

    put "<string>&querystr</string>";
  run;
%mend temp;

%temp(querystr="term 1" and "term2");

Обратите внимание, что этот фрагмент кода не будет компилироваться, поскольку первая кавычка в querystr закроет начальную кавычку оператора put, когда компилятор заменит querystr на шаге данных.

Я хотел бы замаскировать кавычки в строке запроса, чтобы преобразовать ее в действительный фрагмент XML, например:

<string>&quot;term 1&quot; and &quot;term 2&quot;</string>

Есть ли способ вывести вышеуказанную строку в файл с правильной маскировкой кавычек? Я пытался использовать функцию% sysfunc (TranWrd ()) в сочетании с такими функциями маскирования, как% nrbquote () и т. Д., Но до сих пор не нашел работающего решения. Любая помощь приветствуется!

Ответы [ 4 ]

3 голосов
/ 11 ноября 2010

Добавьте htmlencode с опцией 'quot' к шагу данных и используйте% bquote для маскировки кавычек до выполнения макроса.

%macro temp(querystr=);

  filename request temp;

  data _null_;

    file request;

    string = cats('<string>',htmlencode("&querystr",' quot'),'</string>');

    put string;

  run;

%mend temp;

%temp(querystr=%bquote("term 1" and "term2"));
2 голосов
/ 02 декабря 2010

Пока двойные кавычки сбалансированы, макрос вызывается нормально.Таким образом, вам не нужно навязывать пользователям макросов кавычки параметра.Ваш макрос может сделать это для них, как показано ниже.

   %macro temp(querystr=);
     filename request temp;
     data _null_;
       file request;
       s = catx(htmlencode("%superq(querystr)","quot"),"<string>","</string>");
       l = length(s);
       put s $varying. l;
     run;
   %mend temp;

   %temp(querystr="term 1" and "term2");

   /* check */
   data _null_;
     infile request;
     input;
     put _infile_;
   run;
   /* on log
   <string>&quot;term 1&quot; and &quot;term2&quot;</string>
   */ 
1 голос
/ 11 ноября 2010

Попробуйте следующее:

options mcompilenote=all;
%macro temp(querystr=); 
  filename request temp; 

  data _null_; 
    file request; 
    querystr=symget('querystr');
    querystr=htmlencode(querystr,'quot');
    *putlog querystr $;
    string="<string>"!!trim(querystr)!!"</string>";
    put string $200.;
    *put "<string>&querystr</string>"; 
  run; 
%mend temp; 

%temp(querystr="term 1" and "term2"); 
0 голосов
/ 11 ноября 2010

Просто используйте put 'foo';вместо:

%macro temp(querystr=);
  filename request temp;

  data _null_;
    file request;

    put '<string>&querystr</string>';
  run;
%mend temp;

%temp(querystr="term 1" and "term2");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...