web-dev-qa-db-ja.com

SASデータセットの変数名を読み取る方法は?

変数の名前を取得できるステートメント\関数はありますか?できれば、別のデータセットの列、テキストフィールド、またはマクロ変数に配置します。

-データセット1

Name age sex

    Jk   14   F
    FH   34   M
  • 予想されるデータセット

    Var_name_of_dataset1

    Name
    age
    sex
    

PS:私はステートメントを知っています:select into、これは適切に機能します列の値をカスタマイズされたセパレーターを使用してフィールドに読み取ることができるため、列名をフィールドまたは列に読み取る同様の方法があることを望みます。

ありがとう

13
mj023119

PROC CONTENTSは、データセットでその情報を取得する最も速い方法です。列名はNAME列にあります。

proc contents data=sashelp.class out=contents noprint;
run;
25

データステップや配列関数を使用することもできます。

 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; 
実行; 
20
Chris J
%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関数を使用すると、間違ったケースでデータセット名を渡す人の問題を回避できます。作成されたマクロ変数は、グローバルとして定義しないと、マクロの外部で使用できるとは限らないため、グローバルステートメントが必要です。

7
purnendumaity

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) ;

次に、数値と文字が混在している場合でも、大文字と小文字とデータの順序を保持します。

3
Jan Brentved

辞書テーブルの読み取りがすべてのライブラリを照会するというRawfocusのアサーションがtrueであるかどうかはわかりませんが、代わりにsashelp.vcolumnを使用した例ではtrueでした。そのアプローチは非常に遅く、割り当てられたすべてのライブラリにアクセスします。 (SAS RTRACEシステムオプションでこれを証明できます。)

私は、dictionary.columnsへのsqlクエリが、ここで説明するメソッドの中で最も高速であると考えています。明らかに、マクロ化されたコードはマクロなしでも機能しますが、ここでのマクロの要点はユーティリティだと思います。コードをお気に入りのマクロライブラリに配置すれば、二度と考える必要はありません。

0
Smithers