我需要将大量不同的数据集输出到不同的文本文件中。数据集共享一些需要输出的常见变量,但也有很多不同的变量。我已将这些不同的加载到由空格分隔的宏变量中,以便我可以对此进行宏观化。
所以我创建了一个循环数据集的宏,并将每个宏输出到不同的文本文件中。
为此,我在数据步骤中使用了put语句。 PUT语句如下所示:
PUT (all the common variables shared by all the datasets), (macro variable containing all the dataset-specific variables);
E.g:
%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;
其中& vars是包含在当前循环中输出数据集所需的所有变量的宏变量。 例如,哪个解决了:
PUT a b c d special1 special2 special5 ... special329;
现在的问题是,引用的字符串只能是262个字符。我试图输出的一些数据集有很多变量要输出,这个宏变量是一个带引号的字符串,并且包含所有这些变量将比这长得多。我还有其他方法可以做到这一点吗?
答案 0 :(得分: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;
答案 1 :(得分:1)
我会解决这个问题,但每个变量都有1个put语句。使用@
修饰符,以便您不会获得新行。
例如:
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
因此,修改宏以使用此语法循环遍历两组值。
答案 2 :(得分:1)
不确定为什么你在谈论引用的字符串:你不会引用& vars参数。
put a b c d &vars;
不是
put a b c d "&vars";
那里有一个限制,但它要高得多(64k)。
那就是说,我会用CALL EXECUTE
以数据驱动的方式做到这一点。这非常简单,只需一步即可完成,假设您可以轻松确定从WHERE语句中的字典表中输出哪些数据集。这总共有32kiB的限制,但是如果你真的想要解决它,你可以很容易地解决它(你可以将各个位分成多个调用,甚至构建调用,这样如果调用符击到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;