2015-09-03 22 views
1

我已經一個大的數據集,用於指定在不同libnames跨越數據集的變量的元數據(從sashelp.vcolumn拉生成多個SAS程序。使用`filename`語句

通過這個運行我有代碼沿其輸出以下的線。一個大項目 - 這是工作的罰款不過,我既然發現了我將需要轉移的文件名來生成每個新LIBNAME其相應的目錄中的程序遇到:

data _null_ ; 
    set metadata end=eof ; 
    by libname memname ; 
    file sascode ; 

    if first.libname then put "proc datasets lib=" libname " nolist ;"; 
    if first.memname then put " modify "memname ";"; 
    if last.libname then put " run; 
    if eof then   put "quit ;"; 
run ; 

是否有可能將file語句重定向到正確的目錄f或者每個first.libname

+0

當你說'轉移文件名'你的意思是每次libname更改時創建一個新的文件? – Joe

+0

嗨喬 - 謝謝,是的,我試圖結束一個獨特的程序寫入每個libname目錄 – Bendy

+0

你看過文件語句中的filevar選項嗎? – Reeza

回答

1

要在Reeza的回答擴大一點,這裏是你如何使用元數據dictionary.libnames做到這一點。我在這裏使用dictionary.tables,但是如果您需要使用.columns來獲得(無論您對列進行什麼操作),那麼它們也應該可以正常工作。

libname temp 'c:\temp'; 
data class temp.class; 
set sashelp.class; 
run; 

proc sql; 
    create table metadata as 
    select T.libname, T.memname, L.path 
    from dictionary.tables T, dictionary.libnames L 
    where T.libname=L.libname 
    and T.memname='CLASS' 
    and level=0 /* this eliminates SASHELP lib which is a bit crazy */ 
    ; 
quit; 


data _null_ ; 
    set metadata end=eof; 
    by libname path memname ; 
    fn = cats(path,'\sasfile.sas'); 
    file sascode filevar=fn; 

    if first.libname then put "proc datasets lib=" libname " nolist ;"; 
    if first.memname then put " modify " memname ";"; 
    if last.libname then put " run; quit;"; 
run ; 
+0

謝謝喬 - 拉字典表的路徑太完美了:-) @Reeza也謝謝你 - 我也提高了。喬,出於興趣 - 你爲什麼說「...... SASHELP lib有點瘋狂」? – Bendy

+1

SASHELP是一個組合的lib,它有11個目錄(或左右)組成。所以你會爲此生成很多文件。 – Joe

2

在文件語句中使用FILEVAR選項。

從SAS KB24599:http://support.sas.com/kb/24/599.html

/* Create sample data */ 

data test; 
    input color $ num; 
datalines; 
blue 1 
blue 2 
blue 3 
green 4 
green 5 
red 6 
red 7 
red 8 
; 

data _null_; 
    length fname $30.; 
    set test;  
    by color;            
    if first.color then count+1; 
    fname="C:\TEMP\file" || trim(left(put(count,8.)))||".txt"; 
    file dummy filevar=fname; 
    put color num count; 
run;