目标:使用数据步骤将整个 SAS 数据集导出到制表符分隔的文本文件。
问题:在我能找到的每个示例中,例如这个示例,必须在 PUT 语句之后的数据步骤中指定每个变量。 难道没有一种简单的方法来询问“所有”变量吗?
我已经尝试过使用PUT _ALL_
,但它在输出的每一行中都包含变量名,而不仅仅是输出值。
如果您想在数据步骤中执行此操作,并且不想指定某些内容,但真的不想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
也许您可以修改它以添加name||' :date9.'
到这些变量的 sql 查询中。
请注意,dictionary.columns 中的 libname/memname/name 字段通常是大写的。我不认为它们总是大写,但它们几乎总是如此。(例如,我相信某些 RDBMS 可以覆盖它)。
@Joe 一如既往的聪明而敏捷。
作为参考,许多选项,ENCODING
包括FILENAME
. 这些应该可以在任何允许文件路径的地方使用。
FILENAME myfile "E:\test.csv" encoding=wlatin2;
PROC EXPORT
DATA=sashelp.class
OUTFILE=myfile
DBMS=TAB REPLACE;
run;
在一个数据步骤中,我发现我只想使用
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;
您需要同时使用变量列表和格式列表才能_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;