2011-03-21 836 views
12

是否有任何能夠獲取變量名稱的語句\函數? 最好將它們放入另一個數據集,文本字段或宏變量的列中。如何讀取SAS數據集中的變量名稱?

E.g.

- 數據組1

Name age sex 

    Jk 14 F 
    FH 34 M 
  • 預期的數據集

    Var_name_of_dataset1

    Name 
    age 
    sex 
    

PS:我知道一條語句:select into,它確實相關 它可以將列的值讀入具有自定義分隔符的字段中,因此希望有類似的方式將列名讀入字段或列。

謝謝

回答

25

PROC CONTENTS是獲取數據集中信息的最快方法。列名可以在NAME列中找到。

proc contents data=sashelp.class out=contents noprint; 
run; 
+0

非常感謝Laurent!這非常有用。 CHers – mj023119 2011-03-24 01:31:15

19

您還可以使用datastep和數組函數,例如,

 
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 ; 
+4

+1:我認爲這可能是最有用和最靈活的方法。你可以輸出你想要的數據步驟 - 一個特定格式的數據集,或者CALL SYMPUT來設置給定樣式的宏變量。你也可以做VLABEL,VFORMAT等來獲取其他信息。 – 2011-03-21 17:43:11

+0

嗨克里斯,我會稍後嘗試你的方法。謝謝你們一樣:) – mj023119 2011-03-24 01:32:37

+0

我知道proc的內容,但是這更靈活。非常感謝! – Matt 2015-07-10 09:50:28

7
%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函數可以避免有人在錯誤的情況下傳遞數據集名稱時出現問題。全局聲明是必要的,因爲創建的宏變量不一定會在宏外部可用而不將其定義爲全局

+0

有幾個問題 - 首先,這裏的字典表可能會很慢,因爲它會查詢所有庫。其次,upcase函數會在每條記錄上觸發。%upcase會更有效。最後,爲什麼即使使用宏?這在開放代碼中可以正常工作。 – 2015-01-14 13:39:08

0

我不確定讀取字典表時查詢所有庫的Rawfocus斷言是否爲真,例如使用了sashelp。 vcolumn,那麼它會是真的,這種方法是非常緩慢的,並訪問所有庫分配。 (你可以用SAS RTRACE系統選項來證明這一點。)

我認爲對dictionary.columns的sql查詢是這裏概述的最快的方法。顯然,宏代碼的代碼可以在沒有宏的情況下工作,但宏觀的重點在於我認爲它是一種工具;把代碼放到你最喜歡的宏庫中,你永遠不需要再考慮它。

2

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

然後,我們保存案件和命令的數據,即使數字和字符混合。

+0

不要忘記關閉數據集:'%sysfunc(close(&dsid));' – zuluk 2017-12-01 10:14:35

+0

@zuluk在哪裏放這行?我不能讓它工作 – 2018-01-22 15:15:47

+0

在宏末尾寫這些行: '%let rc =%sysfunc(close(&dsid));' '%put varlist =&varlist;' '%修改名稱; 我也沒有'sasuser.class'。對於我'sashelp.class'的作品。 – zuluk 2018-01-23 07:23:11