将SAS数据集转换为具有双引号的管道分隔文本文件(用于文本属性)
我找到了一个宏,可以将SAS数据集转换为带有双引号的管道分隔文本文件,但无法确定如何在文本文件中添加属性名称/标题。感谢你能提供的任何帮助。 下面是在没有属性名称的情况下为文本文件(用双引号分隔的管道,用于文本属性)生成的宏将SAS数据集转换为具有双引号的管道分隔文本文件(用于文本属性),sas,dataset,Sas,Dataset,我找到了一个宏,可以将SAS数据集转换为带有双引号的管道分隔文本文件,但无法确定如何在文本文件中添加属性名称/标题。感谢你能提供的任何帮助。 下面是在没有属性名称的情况下为文本文件(用双引号分隔的管道,用于文本属性)生成的宏 %macro csvQuoteChars(lib=,dset=,outPath=); proc contents data=&lib..&dset out=vars(keep=name varnum type); run; proc sql print;
%macro csvQuoteChars(lib=,dset=,outPath=);
proc contents data=&lib..&dset out=vars(keep=name varnum type);
run;
proc sql print;
select (strip(name)) into :vars separated by '|' from vars
order by varnum;
quit;
%let dsid = %sysfunc(open(vars));
%let nobs = %sysfunc(attrn(&dsid,nlobs));
data _null_;
set &lib..&dset;
file "&outPath\&lib..&dset..txt" dsd dlm='|';
%do i=1 %to &nobs;
%let rc = %sysfunc(fetchobs(&dsid,&i));
%let vName = %sysfunc(getvarc(&dsid,1));
%let vType = %sysfunc(getvarn(&dsid,2));
%put &=vName &=vType;
%if &vType = 2 %then %do;
put (&vName) (~) @;
%end;
%else %if &vType = 1 %then %do;
put &vName @;
%end;
%if &i = &nobs %then %do;
put ;
%end;
%end;
run;
%let dsid = %sysfunc(close(&dsid));
%mend csvQuoteChars;
%csvQuoteChars(lib=ed,dset=stopoverchg_201709,outPath=d:\temp);
默认情况下,SAS将为包含分隔符的值执行此操作,因此您不必执行所有字符值,除非我认为这是一项要求。但是,这将正确导出文件
data class;
set sashelp.class;
if name='Alfred' then name = 'Al|fred';
run;
proc export data=class outfile='/folders/myfolders/class.txt' dbms=dlm replace;
delimiter='|';
run;
Export
per@Reeza要简单得多
宏也可以更改为输出带有变量名的标题行。宏使用以管道分隔的变量名列表填充宏变量vars
,然后从不使用它
将此行添加到文件
语句之后的数据null
:
if _n_ = 1 then put "&vars";
问题的代码生成部分过于复杂。您只需要生成一个put语句,如:
put name ~ sex ~ age height weight ;
因此,制作宏变量来帮助实现这一点。您还可以制作标题所需的信息。我假设您还希望在标题值周围加引号。在选择列表中包括VARNUM,以避免PROC SQL关于按未选择的值排序的警告
proc sql noprint;
select varnum
, quote(trim(name))
, catx(' ',name,case when (type=2) then '~' else ' ' end)
into :dummy
, :headers separated by '|'
, :varlist separated by ' '
from vars
order by varnum
;
quit;
那么您写入数据的步骤就是:
data _null_;
set &lib..&dset;
file "&outPath\&lib..&dset..txt" lrecl=2000000 dsd dlm='|';
if _n_=1 then put %sysfunc(quote(&headers),%str(%')) ;
put &varlist;
run;
这很有帮助!如何在文本文件中添加标题行(不带引号)?谢谢,tom!已尝试此操作,但文本文件仍然不包含标题,是否缺少任何内容?若要调试宏定义,请在调用宏之前打开MPRINT选项。然后您可以看到生成的代码。这将使我们更容易发现问题所在。如果根本没有标题行,则可能是查看了错误的文本文件,或者是If-then语句键入错误。条件是测试自动数据步迭代变量
\n\u
是否为1。谢谢Reeza!我不打算用管道分隔名称,而是将标题(不带引号)添加到文本输出中。如果你有其他的建议,请告诉我。不过这两者都可以。