2017-03-31 203 views
1

我需要輸出很多不同的數據集到不同的文本文件。數據集共享一些需要輸出的常見變量,但也有許多不同的變量。我已經將這些不同的變量加載到由空格分隔的宏變量中,以便我可以將其宏觀化。輸出到文本文件

因此,我創建了一個循環遍歷數據集並將每個輸出到不同文本文件的宏。

爲此,我在數據步驟中使用了put語句。 PUT語句是這樣的:

PUT (all the common variables shared by all the datasets), (macro variable containing all the dataset-specific variables); 

例如爲:

%MACRO OUTPUT(); 
    %DO N=1 %TO &TABLES_COUNT; 
     DATA _NULL_; 
      SET &&TABLE&N; 
      FILE 'PATH/&&TABLE&N..txt'; 
      PUT a b c d "&vars"; 
     RUN; 
    %END; 
%MEND OUTPUT; 

哪裏&瓦爾是包含所需的輸出在電流回路數據集中的所有變量宏變量。 它得到解決,例如,:

PUT a b c d special1 special2 special5 ... special329; 

現在的問題是,所引用的字符串只能是262個字符。我嘗試輸出的一些數據集有很多變量需要輸出,這個引用字符串的宏變量將保存所有這些變量。有沒有其他方法可以做到這一點?

+1

我不認爲PUT語句可以引用的變量數量是有限制的。但是爲什麼在你的PUT語句中有逗號? – Tom

+0

刪除了逗號並修改了問題。感謝您指出! – puk789

+0

行情也不需要... – Joe

回答

1

我會解決這個問題,但每個變量有1個語句。使用@修飾符,以便不會換行。

例如:

data test; 
a=1; 
b=2; 
c=3; 
output; 
output; 
run; 

data _null_; 
set test; 
put a @; 
put b @; 
put c @; 
put; 
run; 

輸出到日誌:

800 data _null_; 
801 set test; 
802 put a @; 
803 put b @; 
804 put c @; 
805 put; 
806 run; 

1 2 3 
1 2 3 
NOTE: There were 2 observations read from the data set WORK.TEST. 
NOTE: DATA statement used (Total process time): 
     real time   0.07 seconds 
     cpu time   0.03 seconds 

所以通過兩套使用此語法值的修改您的宏循環。

+0

刪除了逗號並修改了問題。感謝您指出! – puk789

2

請勿在變量名稱列表中包含引號。

put a b c d &vars ; 

不應該有任何限制的變量可以輸出數量,但如果輸出線的長度變得很長SAS會換到一個新行。默認行長度當前爲32,767(但較早版本的SAS使用256作爲默認行長度)。如果你願意,你可以設置得更高。所以你可以使用1,000,000例如。上限可能取決於您的操作系統。

FILE "PATH/&&TABLE&N..txt" lrecl=1000000 ; 

如果你只是想確保公共變量出現前(即你是不排除任何變量),那麼也許你並不需要的變量列表中的每個表都。

DATA _NULL_; 
    retain a b c d ; 
    SET &&TABLE&N; 
    FILE "&PATH/&&TABLE&N..txt" lrecl=1000000; 
    put (_all_) (+0) ; 
RUN; 
+0

刪除了逗號並修改了問題。感謝您指出! – puk789

1

不知道你爲什麼在談論引用的字符串:你不會引用&變量的參數。

put a b c d &vars; 

put a b c d "&vars"; 

有有限制,但它的高得多(64K)。

這就是說,我會以數據驅動的方式與CALL EXECUTE做到這一點。這很簡單,只需一步即可完成,假設您可以輕鬆確定在WHERE語句中從字典表中輸出哪些數據集。這總共有32kiB的限制,但如果你真的要去了解一下,你可以很容易地解決它(你可以將不同的位分成多個調用,甚至構造調用,以便如果calltr長達32000長你發出一個呼叫執行它,然後繼續)。

這可以避免必須管理一堆大的宏變量(你的&VAR真的會是&&VAR&N,並且會是許多大的宏變量)。

data test; 
    length vars callstr $32767; 
    do _n_ = 1 by 1 until (last.memname); 
    set sashelp.vcolumn; 
    where memname in ('CLASS','CARS'); 
    by libname memname; 
    vars = catx(' ',vars,name); 
    end; 
    callstr = catx(' ', 
    'data _null_;', 
    'set',cats(libname,'.',memname),';', 
    'file',cats('"c:\temp\',memname,'.txt"'),';', 
    'put',vars,';', 
    'run;'); 
    call execute(callstr); 
run;