Ответ 1
СОДЕРЖАНИЕ PROC будет самым быстрым способом получить эту информацию в наборе данных. Имена столбцов можно найти в столбце NAME.
proc contents data=sashelp.class out=contents noprint;
run;
Существуют ли какие-либо операторы\функции, способные получить имя переменных? Предпочтительно помещать их в столбец другого набора данных, текстовое поле или макрокоманду.
например.
- набор данных 1
Name age sex
Jk 14 F
FH 34 M
Ожидаемый набор данных
Var_name_of_dataset1
Name
age
sex
PS: Я знаю выражение: выберите, что действительно важно Он может считывать значение столбца в поле с настраиваемыми разделителями и, следовательно, желать, чтобы аналогичные способы чтения имен столбцов были в поле или столбец.
Спасибо
СОДЕРЖАНИЕ PROC будет самым быстрым способом получить эту информацию в наборе данных. Имена столбцов можно найти в столбце NAME.
proc contents data=sashelp.class out=contents noprint;
run;
Вы также можете использовать функции datastep и array, например
data colnames ; set sashelp.class (obs=1) ; array n{*} _NUMERIC_ ; array c{*} _CHARACTER_ ; do i = 1 to dim(n) ; vname = vname(n{i}) ; output ; end ; do i = 1 to dim(c) ; vname = vname(c{i}) ; output ; end ; run ;
%macro getvars(dsn);
%global vlist;
proc sql;
select name into :vlist separated by ' '
from dictionary.columns
where memname=upcase("&dsn");
quit;
%mend;
Это создает макрокоманду с именем & vlist, которая будет содержать имена всех переменных в вашем наборе данных, разделенные пробелом. Если вы хотите запятые между именами переменных, все, что вам нужно сделать, это изменить значение "разделяемое" с "на",". Использование функции upcase в инструкции where позволяет избежать проблем с передачей имени набора данных в неправильном случае. Глобальный оператор необходим, поскольку созданная макрокоманда не обязательно будет доступна вне макроса, не определяя ее как глобальную
Немного изменено из справки и документации SAS.
%macro names(dsid);
%let dsid=%sysfunc(open(&dsid, i));
%let num=%sysfunc(attrn(&dsid,nvars));
%let varlist=;
%do i=1 %to &num ;
%let varlist=&varlist %sysfunc(varname(&dsid, &i));
%end;
%let rc = %sysfunc(close(&dsid)); /*edit by Moody_Mudskipper: omitting this line will lock the dataset */
%put varlist=&varlist;
%mend names;
%names(sasuser.class) ;
Затем мы сохраняем регистр и данные о выводе, даже если числовое и символьное символы смешаны.
Я не уверен, что утверждение Rawfocus о том, что чтение таблиц словарей запрашивает все библиотеки, истинно, если бы вместо этого использовался sashelp.vcolumn, тогда это было бы правдой, этот подход очень медленный и имеет доступ ко всем выделенным библиотекам. (Это можно доказать с помощью опции SAS RTRACE.)
Я придерживаюсь мнения, что запрос sql к словарю. columns является самым быстрым из описанных здесь методов. Очевидно, что макротизированный код работал бы без макроса, но точка макроса здесь я считаю утилитой; поместите код в свою любимую библиотеку макросов, и вам больше не придется об этом думать.