输出到文本文件
我需要输出很多不同的数据集到不同的文本文件。数据集共享一些需要输出的常见变量,但也有许多不同的变量。我已经将这些不同的变量加载到由空格分隔的宏变量中,以便我可以将其宏观化。输出到文本文件
因此,我创建了一个循环遍历数据集并将每个输出到不同文本文件的宏。
为此,我在数据步骤中使用了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个语句。使用@
修饰符,以便不会换行。
例如:
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
所以通过两套使用此语法值的修改您的宏循环。
删除了逗号并修改了问题。感谢您指出! – puk789
请勿在变量名称列表中包含引号。
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;
删除了逗号并修改了问题。感谢您指出! – puk789
不知道你为什么在谈论引用的字符串:你不会引用&变量的参数。
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;
我不认为PUT语句可以引用的变量数量是有限制的。但是为什么在你的PUT语句中有逗号? – Tom
删除了逗号并修改了问题。感谢您指出! – puk789
行情也不需要... – Joe