Как ссылаться на управляющие символы (например, CRLF) в макросе SAS - PullRequest
0 голосов
/ 11 декабря 2018

Мне нужно найти управляющие символы (например, LF) внутри макропеременной.

Приведенный ниже шаг данных подтверждает наличие управляющих символов.Мой вопрос - как мне проверить это в макрофункции?

data _null_;
  length start mactest  $10;
  start='blah' !! '0A'x !! 'blah';
  call symputx('mactest',start);
  mactest=symget('mactest');
  finish1=find(start,'0A'x);
  finish2=find(start,byte(10));
  finish3=find(start,'
');
put finish1= finish2= finish3=;
run;

%put whereisit? %sysfunc(find(&mactest,'0A'x));
%put no, really? %sysfunc(find(&mactest,%sysfunc(byte(10))));
%put do I really need to do this? %sysfunc(find(&mactest,%str(
)));

log result

^^ Мне удалось получить результат буквальнодобавление возврата каретки с моей клавиатуры, но очень странно, что это отличалось в зависимости от того, был ли он введен в шаг данных или макрос (я использую macbook, studio, 9.4, firefox).

РЕДАКТИРОВАТЬ - по отзывам от @FriedEgg и @Stu можно искать, используя qsysfunc(), однако это прерывается, когда макро-переменная содержит пробел - например:

data _null_;
  length lf $10;
  lf='bl ah' !! '0A'x !! 'blah';
  call symputx('lf',lf);
run;
/* returns 3 but should return 6 */
%put lf=%sysfunc(find(&lf,%qsysfunc(inputc(0A,$hex.))));

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Функция виновата, как только строки mactest или lf введены в find возврат каретки 0 или перевод строки или тому подобное просто преобразованы в пробелы \x20, поэтому вы видите эти результаты,Лучшее решение, которое я могу придумать, - это максимально приблизить проблему к SAS macro BS ...

proc fcmp outlib=work.func.macro;
  function symgetz(mvar $) $;
      dsid = open('sashelp.vmacro(where=(name='!!quote(upcase(strip(mvar)))!!'))');
        rc = fetch(dsid);
        return (getvarc(dsid, varnum(dsid, 'value')));
  endsub;

  function prxmatchz(prx $,mvar $);
      return (prxmatch(prx,symgetz(mvar)));
  endsub;
quit;

options cmplib=work.func;

data _null_;
  test='bl ah' !! '0A'x !! 'blah';
  call symput('test',test);
run;

%put cr=%sysfunc(prxmatchz(/\x0A/,test));
0 голосов
/ 12 декабря 2018

Преобразуйте его в шестнадцатеричное с помощью inputc и заключите в него значение %qsysfunc вместо %sysfunc, поскольку возврат каретки является специальным символом, который будет игнорироваться компилятором макроса.

%put hereitis! %sysfunc(find(&mactest,%qsysfunc(inputc(0A, $hex.) ) ) );
...