2014-12-31 59 views
2

我正在處理一個相當大的幾個數據集,這些數據集以CSV文件形式提供給我。當我嘗試導入其中一個文件時,數據將正常顯示,但是,文件中的變量數量對於SAS來說太大,因此它會停止讀取變量名稱並開始爲它們分配順序編號。爲了保持變量名關數據集的我開始對1數據行讀取文件中的所以也沒看第一行作爲變量名 -設置SAS數據集的標籤等於它們的變量名稱

proc import file="X:\xxx\xxx\xxx\Extract\Live\Live.xlsx" out=raw_names dbms=xlsx replace; 
    SHEET="live"; 
    GETNAMES=no; 
    DATAROW=1; 
run; 

然後我運行一個宏來啓動打破數據集,並重新命名變量,根據每個變量中的第一個意見 -

%macro raw_sas_datasets(lib,output,start,end); 
    data raw_names2; 
     raw_names; 
      if _n_ ne 1 then delete; 
      keep A -- E &start. -- &end.; 
    run; 
    proc transpose data=raw_names2 out=raw_names2; 
     var A -- &end.; 
    run; 
    data raw_names2; 
     set raw_names2; 
      col1=compress(col1); 
    run; 
    data raw_values; 
     set raw; 
      keep A -- E &start. -- &end.; 
    run; 
    %macro rename(old,new); 
     data raw_values; 
      set raw_values; 
       rename &old.=&new.; 
     run; 
    %mend rename; 
    data _null_; 
     set raw_names2; 
      call execute('%rename('||_name_||","||col1||")"); 
    run; 
    %macro freq(var); 
     proc freq data=raw_values noprint; 
      tables &var./out=&var.; 
     run; 
    %mend freq; 
    data raw_names3; 
     set raw_names2; 
      if _n_ < 6 then delete; 
    run; 
    data _null_; 
     set raw_names3; 
      call execute('%freq('||col1||")"); 
    run; 
    proc sort data=raw_values; 
     by StudySubjectID; 
    run; 
    data &lib..&output.; 
     set raw_values; 
    run; 
%mend raw_sas_datasets; 

我遇到的問題是變量名稱現在所有的設置是否正常,數據正確一字排開,但標籤仍然是SAS分配的原始序列號。有什麼辦法可以將所有的標籤設置爲等於變量名稱嗎?

+1

很可能SAS的變量數量不是太大(我從來沒有見過這種情況是真的),但變量名的行對於LRECL來說太長了。我也希望你沒有使用XLSX。 – Joe

+0

您應直接導入CSV並且不要將XLSX用作中介,這會導致您的變量數量出現問題。 – Reeza

回答

2

如果你只是想刪除變量標籤(在這一點上,他們默認到變量名稱),這很容易。從SAS Documentation

proc datasets lib=&lib.; 
    modify &output.; 
    attrib _all_ label=' '; 
run; 

我懷疑你有一個比上述更簡單的解決方案,但。

  • 實際的重命名步驟需要以不同的方式完成。現在它一遍又一遍地重寫整個數據集 - 對於很多變量來說這是一個糟糕的主意。將你的重命名語句全部集成到一個datastep中,或者寫入PROC DATASETS或其他的東西。查看'列表處理SAS',瞭解如何做到這一點的細節;在這個網站或谷歌,你會發現很多解決方案。

  • 您可能會在整個第一行讀取SAS。變量的數量不是問題;這可能是該線的長度。還有另外一個問題,如果我能在幾個月前在這個網站上找到解決這個確切問題的信息,我會發現這個問題。

  • 我的首選選項是不使用PROC IMPORT來處理CSV;我會建議編寫一個元數據表,存儲變量的名稱和變量的長度/類型,然後使用它來編寫導入代碼。首先需要做更多的工作,但每次研究只需要完成一次,並且保證PROC​​ IMPORT不會爲您做出愚蠢的決定。

2

在圖書館sashelp是一個表列vcolumn。 vcolumn按表格包含每個庫的變量的所有名稱。您可以編寫一個宏,將所有變量名稱放入宏變量中,然後從那裏設置標籤。

下面是一些代碼,我放在一起(不是很漂亮),但它確實你在找什麼:

data test.label_var; 
x=1; 
y=1; 
label x = 'xx'; 
label y = 'yy'; 
run; 

proc sql noprint; 
    select count(*) into: cnt 
      from sashelp.vcolumn 
       where memname = 'LABEL_VAR';quit; 
%let cnt = &cnt; 

proc sql noprint; 
    select name into: name1 - :name&cnt 
      from sashelp.vcolumn 
       where memname = 'LABEL_VAR';quit; 

%macro test; 

    %do i = 1 %to &cnt; 

     proc datasets library=test nolist; 

      modify label_var; 

      label &&name&i=&&name&i; 

     quit; 

    %end; 
%mend test; 
%test; 
+1

爲什麼不把proc數據集和退出語句放在宏循環之外?如果您使用select into,爲什麼不選擇標籤代碼本身爲單個字符串呢? – Joe

+1

例如'將catx('','label',name,'='',name,'';')選擇爲:由''從...開始分隔的labellist,或者創建一個小宏,並選擇對它的調用。那麼你不必做一個無用的宏,並擔心循環... – Joe

相關問題