快递" PUT所有变量"在数据步骤中导出SAS数据

时间:2014-04-28 18:00:49

标签: text export sas datastep

目标:使用数据步骤将整个SAS数据集导出到制表符分隔的文本文件中。

问题:在我能找到的每个例子中,例如this one,必须在PUT语句后面的数据步骤中指定每个变量。 不是只有一个简单的方法来要求"所有"变量?

我已经尝试过使用PUT _ALL_,但是在输出的每一行都包含变量名,而不是只输出值。

4 个答案:

答案 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;