Макрос SAS для изменения имен столбцов - PullRequest
0 голосов
/ 06 сентября 2018

как использовать макрос для изменения имен столбцов таблицы, кроме тех, на которые вы указали. К столбцам числового типа добавляется префикс "XC_", а к столбцам типа символов добавляется префикс "XN _"

1 Ответ

0 голосов
/ 06 сентября 2018

Правильный служебный макрос примет все абстракции обработки в качестве параметров:

  • data=, набор данных для работы на
  • copy=, переменные оставить в покое (копия - дань уважения оператору копирования в TRANSPOSE)
  • char_prefix=XC_, префикс для применения к именам непереписанных символьных переменных, по умолчанию XC_
  • num_prefix=XN_, префикс для применения к именам не скопированных числовых переменных, по умолчанию XN_

Внутренности служебного макроса - это черный ящик. Иногда дизайн внутренних элементов указывается для того, чтобы можно было выполнять шаги DATA и PROC.

Пример кода

Proc SQL используется для заполнения макропеременной списком пар старых = новых имен, которые можно использовать в операторе RENAME, выполняемом Proc DATASETS

%macro Fixer ( data=, copy=, char_prefix=XC_, num_prefix=XN_ );

  %let syslast = &data;

  %local lib mem rename_clause;

  %let lib = %scan(&syslast,1);
  %let mem = %scan(&syslast,2);

  proc sql noprint;
    select 
      trim(name) || '=' || 
      case type
        when 'num'  then "&num_prefix" || name
        when 'char' then "&char_prefix" || name
        else ''
      end
      into :rename_clause separated by ' '
    from 
      dictionary.columns
    where 
          libname = "&lib"
      and memname = "&mem"
      and indexw (%upcase("&copy"), upcase(name)) = 0
  ;

  proc datasets nolist;
    modify &data;
    rename &rename_clause;
  run;
  quit;
%mend;


data class;
  set sashelp.class;
  teacher = 'Davidowski';
run;

options mprint;

%Fixer ( data=class, copy=Name )

В других случаях внутренности не должны генерировать какой-либо код. Для этого вопроса такой макрос будет использовать макрофункцию %SYSFUNC для доступа к функциям набора данных, таким как open, close, attrn, vartype, varname, поскольку он проверяет критерии переименования и накапливает old = new name пары, которые будут выбраны для использования вызываемым абонентом.

...