目标:使用数据步骤将整个SAS数据集导出到制表符分隔的文本文件中。
问题:在我能找到的每个例子中,例如this one,必须在PUT语句后面的数据步骤中指定每个变量。 不是只有一个简单的方法来要求"所有"变量?
我已经尝试过使用PUT _ALL_
,但是在输出的每一行都包含变量名,而不是只输出值。
答案 0 :(得分:6)
如果您想在数据步骤中执行此操作,并且不希望指定内容,但实际上不希望PROC EXPORT
为您做出决策,并且拥有可以合理轻松指定的数据(没有任何想象力你想要的特殊格式的日期),你可以做到这一点。
proc sql;
select name into :namelist separated by ' '
from dictionary.columns
where libname='SASHELP' and memname='CLASS'; *these are the libname/dataset name you want;
quit;
filename blah temp;
data _null_;
set sashelp.class;
file blah dlm='09'x;
put &namelist.;
run;
您可以根据需要通过修改sql查询来自定义一些(例如,如果您有一组带有_date
的变量,也许您可以修改它以在SQL查询中添加name||' :date9.'
那些。
请注意,dictionary.columns中的libname / memname / name字段通常是大写的。他们不是总是大写,我不认为,但他们几乎总是。 (例如,有些RDBMS可以覆盖它)。
答案 1 :(得分:1)
@ Joe一如既往地精彩而快速。
作为参考,ENCODING
可以使用许多选项,包括FILENAME
。这些应该可以在允许文件路径的任何地方使用。
FILENAME myfile "E:\test.csv" encoding=wlatin2;
PROC EXPORT
DATA=sashelp.class
OUTFILE=myfile
DBMS=TAB REPLACE;
run;
答案 2 :(得分:0)
在datastep中,我发现当我只想使用
获取值列表时put (_all_)(=/);
例如:
data a;
ref=today();
monday = intnx('week1.2',ref,-1,'Begin');
sunday = intnx('week1.2',ref,-1,'End');
week_end_Friday=intnx('day',(intnx('weeks',ref,0,'end')),-1);
week_end_cur=intnx('weeks',ref,0,'end');
format _all_ weekdate.;
put (_all_)(=/);
run;
/ *或查看一些记录或修改特定条件* /
data test;
set test;
if _n_ < 5 then do;
PUT (_ALL_)(=/);
end;
run;
答案 3 :(得分:0)
您需要同时使用变量列表和格式列表来使用_ALL_
语句中的PUT
关键字,而不是生成名称。格式列表不需要包含任何实际格式,但不能为空。因此,此代码将创建一个CSV文件,不带列标题。
data _null_;
file 'want.csv' dsd ;
set have ;
put (_all_) (+0) ;
run;
如果您确实需要列标题,可以使用几种方法。这是一个使用PROC TRANSPOSE
生成带有变量名称的数据集的文件。这可用于编写标题行,然后可以使用上面的代码,只需在MOD
语句中添加FILE
关键字即可附加数据记录。
proc transpose data=have(obs=0) out=names ;
var _all_;
run;
data _null_;
file 'want.csv' dsd ;
set names end=eof;
put _name_ @ ;
if eof then put;
run;