2017-03-31 161 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;