3

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

问题:在我能找到的每个示例中,例如这个示例,必须在 PUT 语句之后的数据步骤中指定每个变量。 难道没有一种简单的方法来询问“所有”变量吗?

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

4

4 回答 4

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也许您可​​以修改它以添加name||' :date9.'到这些变量的 sql 查询中。

请注意,dictionary.columns 中的 libname/memname/name 字段通常是大写的。我不认为它们总是大写,但它们几乎总是如此。(例如,我相信某些 RDBMS 可以覆盖它)。

于 2014-04-28T18:29:39.407 回答
1

@Joe 一如既往的聪明而敏捷。

作为参考,许多选项,ENCODING包括FILENAME. 这些应该可以在任何允许文件路径的地方使用。

FILENAME myfile "E:\test.csv" encoding=wlatin2;

PROC EXPORT
DATA=sashelp.class
OUTFILE=myfile
DBMS=TAB REPLACE;
run;
于 2014-04-28T18:38:45.927 回答
0

在一个数据步骤中,我发现我只想使用

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;
于 2017-03-20T19:47:11.030 回答
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;
于 2017-03-20T20:10:28.867 回答