2011-03-04 58 views
4

是否可以使用存儲在數據集列中的值創建文件名?我所追求的是類似的東西:SAS,從數據集列中創建文件名

/* 
    other code here, assume work.users looks like 
    user_id 
    ImageData 
*/ 

data _null_; 
    set work.users; 

    file_name=cat('/home/me/', trim(user_id), '.jpg'); 

    file file_name NOPRINT; 

    put ImageData; 
run; 

此刻我試圖用宏來做,但我沒有任何運氣。

回答

8

爲此,您需要首先創建file_name變量,然後您可以在新數據步驟中使用filevar=選項來動態寫入文件。當使用

data _null_; 
    set work.users; 
    file dummy filevar=file_name noprint; 
    put ImageData; 
run; 

注意dummy只是一個佔位符:

因此,首先在work.users創建FILE_NAME:

data work.users; 
    length file_name $255; 
    file_name=cats('/home/me',user_id,'.jpg'); 
run; 

然後做你試圖使用filevar =選項做什麼filevar=方法。

+1

謝謝!這正是我需要的。 – vasdee 2011-03-04 06:00:27

+0

謝謝!你救了我很多麻煩。 – Frewuill 2014-07-01 21:21:52

1

如果你想與宏做到這一點:

data _null_; 
    set work.users; 
    call symput('filename', cats('/home/me/', user_id, '.jpg')); 
run; 

data _null_; 
    set work.users; 
    file "&filename." noprint; 
    put imagedata; 
run; 

然而,這種假設只有一個在work.users觀察,我猜是不正確的。如果你想輸出的每個觀察一個文件,把它捲成宏:

%macro writefile(n); 
%do i = 1 %to &n; 

data _null_; 
    i = &i; 
    set users point=i; 
    call symput('filename', cats('c:\temp\', user_id, '.txt')); 
    stop; 
run; 

data _null_; 
    i = &i; 
    set users point=i; 
    file "&filename." noprint; 
    put imagedata; 
    stop; 
run; 

%end; 
%mend; 

這裏,參數& n是數據集中的觀測次數。您可以通過編程方式獲得它,但對於當前的目的而言,將其手動傳遞給宏更容易。

+0

有趣的宏觀解決方案,但是我使用了@sasfrog解決方案,因爲它在這種情況下更容易堆積。 – vasdee 2011-03-04 06:02:29

+1

是一個工作解決方案(並很好地制定),但一個如何宏可以矯枉過正的例子。想象一下這個解決方案對於具有數百萬行的用戶數據集的性能。我的原則是隻有在使用本機數據步驟或處理步驟進行戰鬥之後才能「使用宏」。 – sasfrog 2011-03-04 06:06:35