«Hello World» в SAS с макросом дает синтаксическую ошибку - PullRequest
0 голосов
/ 11 января 2019

Я чрезвычайно новичок в мире SAS, поэтому, естественно, я пытался написать свой «Hello World». Вот мой MWE, который дает мне синтаксические ошибки:

/* SAS Hello World Program */

    /*Macro with date*/
    %Macro datum;
    Title "Hello World, today is &Sysday, &Sysdate";
    %Mend datum;

    /*Create Hello World Data Set */     
    data HelloWorld;
    msg = %datum ;
    run;

    /*Print Hello World*/
    proc print data = HelloWorld;
    run;

Он не печатает сообщение «Hello Wolrd», а выдает синтаксическую ошибку, которую я не понимаю. В Log появляется сообщение, так что в принципе это работает - просто шаг печати - нет. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Макрос, который вы создали, генерирует инструкцию TITLE. Так что должно работать нормально.

Но ваша программа использует его не в том месте. Как только ваш макрос запустится и завершит генерацию текста оператора TITLE, ваш шаг данных будет выглядеть так:

data HelloWorld;
  msg = Title "Hello World, today is Thursday, 10JAN19"; ;
run;

Что, очевидно, приведет к ошибке, поскольку в правой части оператора присваивания теперь есть два токена, переменная с именем TITLE и строковая константа, без какого-либо оператора между ними. Дополнительная точка с запятой просто сгенерирует дополнительный нулевой оператор и не вызовет никаких проблем.

Возможно, вы хотите создать макрос VARIABLE вместо реального макроса?

Для этого ваша программа будет выглядеть примерно так.

%let msg=Hello World, today is &Sysday, &Sysdate ;

data HelloWorld;
  msg = "&msg." ;
run;

Таким образом, когда ссылка на макропеременную будет заменена, будет выполнен запуск этого кода SAS.

data HelloWorld;
  msg = "Hello World, today is Thursday, 10JAN19" ;
run;

Обратите внимание, как вы используете & для запуска оценки макропеременной. Также обратите внимание, что я не добавил кавычки к значению макропеременной, но включил их в код SAS, который был создан с использованием значения макропеременной.

Обратите внимание, что у него есть вчерашний день недели и дата. Это связано с тем, что автоматические макропеременные SYSDAY и SYSDATE устанавливаются при запуске SAS, и я запускал этот код в сеансе SAS, который я начал вчера.

0 голосов
/ 11 января 2019

Вы используете его в качестве заголовка, поэтому вы не можете использовать его для переменной присваивания, если вы новичок, тогда используйте

/* this will print in log*/
data _null_;
put "hello world";
run;

/* or use in datastep by making variable or by using macrovariable*/
%let a= Hello World, today is &Sysday, &Sysdate;
data have;
var= "Hello world";
var2= "&a";
run;


proc print data = have;
run;
...