2016-08-02 83 views
0

我有一個大的SAS數據集raw_data,其中包含從各個國家收集的數據。該數據集有一個「國家」列,列出了觀察起源的國家。我想在raw_data中爲每個國家導出一個單獨的.csv文件。我用下面的數據步驟產生輸出:使用SAS數據導出文件時缺失列名步驟

data _null_; 
    set raw_data; 
    length fv $ 200; 
    fv = "/directory/" || strip(put(country,$32.)) || ".csv"; 
    file write filevar=fv dsd dlm=','; 
    put (_all_) (:); 
run; 

然而,生成的.csv文件將不再從raw_data有列名。我的數據集有超過一百列,因此列出所有列名稱是禁止的。任何人都可以提供一些關於如何修改上述代碼的指導,以便將列名添加到正在導出的.csv文件中?任何幫助表示讚賞!

回答

1

您可以創建一個宏變量來保存變量名稱並將它們放到CSV文件中。

proc sql noprint; 
select name into :var_list separated by ", " 
from sashelp.vcolumn 
where libname="WORK" and memname='RAW_DATA' 
order by varnum; 
quit; 

data _null_; 
set raw_data; 
length fv $ 200; 
by country; 
fv = "/directory/" || strip(put(country,$32.)) || ".csv"; 

if first.country then do; 
    put "&var_list"; 
end; 

file write filevar=fv dsd dlm=','; 
put (_all_) (:); 
run; 
+0

感謝您的回覆Reeza!在您提供的proc sql語句中,是否需要在select子句中手動列出名稱?我有幾百列,所以我想盡可能自動化。 –

+0

否...那是什麼SQL語句,它創建名稱列表。 – Reeza

+0

嗯...當我運行這個,我得到以下錯誤:「錯誤:在貢獻表中找不到以下列:名稱。」 –

1

考慮這個數據步驟與您的程序非常相似。它使用VNEXT查詢PDV並將變量名稱寫爲每個文件的第一條記錄。

proc sort data=sashelp.class out=class; 
    by age; 
    run; 
data _null_; 
    set class; 
    by age; 
    filevar=catx('\','C:\Users\name\Documents',catx('.',age,'csv')); 
    file dummy filevar=filevar ls=256 dsd; 
    if first.age then link names; 
    put (_all_)(:); 
    return; 
names: 
    length _name_ $32; 
    call missing(_name_); 
    do while(1); 
     call vnext(_name_); 
    if _name_ eq: 'FIRST.' then leave; 
     put _name_ @; 
    end; 
    put; 
    run; 
+0

測試'第一'。 (包括期間)。同時將FILEVAR =和FILE語句移動到NAMES塊中。否則,PUT_ALL_也將寫入FILEVAR的值。第一次同意 – Tom

+0

。但是在您提出意見之前,您需要測試該程序,您不知道答案。 –

+0

測試是問題,但在測試中我將FILE語句註釋掉,以便我可以看到LOG中的值。這使變量出現在\ _ALL_列表中。 – Tom