将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;

我找到了一个宏,可以将SAS数据集转换为带有双引号的管道分隔文本文件,但无法确定如何在文本文件中添加属性名称/标题。感谢你能提供的任何帮助。 下面是在没有属性名称的情况下为文本文件(用双引号分隔的管道,用于文本属性)生成的宏

%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!我不打算用管道分隔名称,而是将标题(不带引号)添加到文本输出中。如果你有其他的建议,请告诉我。不过这两者都可以。