変数の名前を取得できるステートメント\関数はありますか?できれば、別のデータセットの列、テキストフィールド、またはマクロ変数に配置します。
例
-データセット1
Name age sex
Jk 14 F
FH 34 M
予想されるデータセット
Var_name_of_dataset1
Name
age
sex
PS:私はステートメントを知っています:select into、これは適切に機能します列の値をカスタマイズされたセパレーターを使用してフィールドに読み取ることができるため、列名をフィールドまたは列に読み取る同様の方法があることを望みます。
ありがとう
PROC CONTENTSは、データセットでその情報を取得する最も速い方法です。列名はNAME列にあります。
proc contents data=sashelp.class out=contents noprint;
run;
データステップや配列関数を使用することもできます。
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; 実行;
%macro getvars(dsn);
%global vlist;
proc sql;
select name into :vlist separated by ' '
from dictionary.columns
where memname=upcase("&dsn");
quit;
%mend;
これにより、スペースで区切られたデータセット内のすべての変数の名前を含む&vlistというマクロ変数が作成されます。変数名の間にコンマが必要な場合は、「区切り文字」の値を「」から「、」に変更するだけです。 whereステートメントでupcase関数を使用すると、間違ったケースでデータセット名を渡す人の問題を回避できます。作成されたマクロ変数は、グローバルとして定義しないと、マクロの外部で使用できるとは限らないため、グローバルステートメントが必要です。
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のアサーションがtrueであるかどうかはわかりませんが、代わりにsashelp.vcolumnを使用した例ではtrueでした。そのアプローチは非常に遅く、割り当てられたすべてのライブラリにアクセスします。 (SAS RTRACEシステムオプションでこれを証明できます。)
私は、dictionary.columnsへのsqlクエリが、ここで説明するメソッドの中で最も高速であると考えています。明らかに、マクロ化されたコードはマクロなしでも機能しますが、ここでのマクロの要点はユーティリティだと思います。コードをお気に入りのマクロライブラリに配置すれば、二度と考える必要はありません。