Создание SAS Array - PullRequest
       36

Создание SAS Array

0 голосов
/ 27 апреля 2018

Я пытаюсь создать массив, который содержит значение.

proc sql noprint;
select count(*) into :dscnt from study;
select libname into :libname1 - :libname&dscnt from study;
quit;

Я думаю, что синтаксис правильный, но я продолжаю получать следующее сообщение об ошибке в SAS studio.

***NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements.
NOTE: Line generated by the macro variable "DSCNT".
79         libname       4
                      _
                      22
                      200
ERROR 22-322: Syntax error, expecting one of the following: ',', FROM, NOTRIM.  

ERROR 200-322: The symbol is not recognized and will be ignored.***

Может кто-нибудь объяснить мне, что я делаю не так?

Спасибо

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Синтаксис into в proc sql сохраняет отформатированные значения в макропеременных. Например, если вы запустите этот код:

proc sql noprint;
  select count(*) into :dscnt from sashelp.class;
quit;

%put #&dscnt#;

Вы увидите вывод:

#      19#

Другими словами, результат остается дополненным пробелами. Это означает, что в вашем примере код разрешается примерно так:

select libname into :libname1 - :libname      19 from study;

^ Что, очевидно, неверный синтаксис. Чтобы это исправить, вы можете просто добавить ключевое слово TRIMMED в оператор SQL:

select count(*) into :dscnt TRIMMED from study;

Спасибо Reeza за ключевое слово TRIMMED.

0 голосов
/ 27 апреля 2018

Вам не нужно заранее знать количество элементов, если вы оставите это поле пустым, SAS автоматически создаст правильное количество макропеременных.

Если вы хотите использовать этот номер в другом месте, вы можете создать его с помощью опции TRIMMED, чтобы удалить лишние пробелы. См. Второй пример ниже.

proc sql noprint;
select name into :name1- from sashelp.class;
quit;

%put &name1;
%put &name19.;

proc sql noprint;
select count(distinct name) into :name_count TRIMMED from sashelp.class;
quit;

%put &name_count;

Результаты:

3068      proc sql noprint;
3069      select name into :name1- from sashelp.class;
3070      quit;
NOTE: PROCEDURE SQL used (Total process time):
      real time           0.00 seconds
      cpu time            0.01 seconds


3071
3072      %put &name1;
Alfred
3073      %put &name19.;
William
3074
3075      proc sql noprint;
3076      select count(distinct name) into :name_count TRIMMED from
3076! sashelp.class;
3077      quit;
NOTE: PROCEDURE SQL used (Total process time):
      real time           0.01 seconds
      cpu time            0.00 seconds


3078
3079      %put &name_count;
19
0 голосов
/ 27 апреля 2018

сделать что-то вроде ниже

 proc sql noprint;
 select count(*) into :dscnt from sashelp.class;
  select name into :name1 - :name%left(&dscnt) from sashelp.class;
  quit;
...