有人能告诉我将SAS数据集以编程方式快速转换为CSV文件的最佳方法吗?我知道可以使用数据步骤并输出到文件等方式。但那是唯一的方法吗?
谢谢, Adnan。
类似这样的东西?
proc export data=sashelp.class
outfile='c:\temp\sashelp class.csv'
dbms=csv
replace;
run;
创建SAS数据集的CSV文件的五种不同方法。
请参考http://studysas.blogspot.com/2009/02/how-to-create-comma-separated-file-csv.html
%ds2csv
宏:http://support.sas.com/documentation/cdl/en/lebaseutilref/64791/HTML/default/viewer.htm#n0yo3bszlrh0byn1j4fxh4ndei8u.htm - Robert Penridgetemp
)来测试和比较将SAS数据集导出为名为temp.csv
的csv文件的方法。
PROC EXPORT data=temp
outfile="temp.csv" dbms=csv replace;
快速运行时间和简单的内置灵活性,可选择其他选项。但是,对于自定义方面并不是最强的。
第二种方法:使用Print过程的ODS。 运行时间:14.09秒。
ODS csv file="temp.csv";
PROC PRINT data=temp noobs;
RUN;
ods csv close;
tabulate
)转换为文件而无需进一步操作时,这种方法也可能会很有用。如果您不需要在lst文件中打印输出,请关闭您的清单(ods listing close
),否则这将花费更长的时间。
DATA _null_;
FILE "temp.csv ";
SET temp;
put (_all_) (',');
RUN;
虽然这种方法的性能并不差,但它不直观且看起来令人困惑。正如上面提到的,您可以更好地控制输出,并且它是所有方法中运行时间最快的。
data _NULL_
方法这是对data _NULL_
方法的一种修改,它在第一个数据步骤中将标题行写入文件,然后在第二个数据步骤中继续用数据行写入同一文件。
%macro outputCSV(dataset,file);
data _NULL_;
file "&file." dlm=',' dsd;
length header $ 2000;
dsid=open("&dataset.","i");
num=attrn(dsid,"nvars");
do i=1 to num;
header = trim(left(coalescec(varlabel(dsid,i),varname(dsid,i))));
put header @;
end;
rc=close(dsid);
run;
data _NULL_;
set &dataset.;
file "&file." mod dlm=',' dsd;
put (_all_) (+0);
run;
%mend;
%outputCSV(sashelp.class,~/temp4.csv)
keep
和drop
数据集选项一起使用(令人惊讶的是),但不幸的是,当使用open()
打开数据集时,nvars
属性会考虑在keep
或drop
后的新变量数,但是varlabel
和varname
函数仍然使用它们的varnum
查找变量。
在下面的示例中,从SASHELP.CLASS
中仅提取Name
(varnum=1)和Height
(varnum=4),因为只保留了两个变量,nvars
为2。但如果我们循环迭代num作为上限,我们会错过Height
,因为它的varnum
为4: 62 data _NULL_;
63 dsid = open("sashelp.class (keep=name height)","i");
64 num = attrn(dsid,"nvars");
65 do i=1 to 5;
66 vname = varname(dsid,i);
67 put i= vname= num=;
68 end;
69 run;
i=1 vname=Name num=2
NOTE: Argument 2 to function VARNAME(1,2) at line 66 column 13 is invalid.
i=2 vname= num=2
NOTE: Argument 2 to function VARNAME(1,3) at line 66 column 13 is invalid.
i=3 vname= num=2
i=4 vname=Height num=2
NOTE: Argument 2 to function VARNAME(1,5) at line 66 column 13 is invalid.
i=5 vname= num=2
dsid=1 num=2 i=6 vname= _ERROR_=1 _N_=1
有两个选项:
nvars
值num
,尽管这只会在日志中产生大量'invalid'
提示这是第一种方法,需要调用两次open
函数:
%macro outputCSV(dataset,file);
data _NULL_;
file "&file." dlm=',' dsd;
length header $ 2000;
dsid=open("%SCAN(&dataset.,1,()","i");
num=attrn(dsid,"nvars");
rc=close(dsid);
dsid=open("&dataset.","i");
do i=1 to num;
header = trim(left(coalescec(varlabel(dsid,i),varname(dsid,i))));
if _error_ = 0 then put header @;
_error_ = 0;
end;
rc=close(dsid);
run;
data _NULL_;
set &dataset.;
file "&file." mod dlm=',' dsd;
put (_all_) (+0);
run;
%mend;
%outputCSV(sashelp.class (keep=name height),~/temp4.csv)
在写完所有内容之后,大多数情况下选择使用PROC EXPORT
或者如果没有太多变量,则明确列出变量可能更合适。这只是展示了可以做什么。
proc transpose data=have(obs=0) out=name; var _all_; run;
然后使用简单的数据步骤编写标题行。接着在编写实际数据行的数据步骤中,在文件语句中添加MOD选项。 - Tomarray _character_
及其对应项,但无法按顺序输出列。 - mjsqu