有谁能告诉我以编程方式将SAS数据集转换为CSV文件的最快方法是什么。我知道我可以使用数据步骤并输出到文件等。但这是唯一的方法吗?
谢谢, 阿德南。
答案 0 :(得分:28)
这些方面的东西?
proc export data=sashelp.class
outfile='c:\temp\sashelp class.csv'
dbms=csv
replace;
run;
答案 1 :(得分:10)
创建SAS数据集的.CSV文件的5种不同方法。
参考http://studysas.blogspot.com/2009/02/how-to-create-comma-separated-file-csv.html
答案 2 :(得分:5)
这里的答案已经解决了许多创建csv的方法,但不一定是这些方法的效率。我创建了一个包含100,000行和5列的样本数据集(temp
),以测试和比较将sas数据集导出到名为temp.csv
的csv的方法。
第一种方法:导出程序。运行时间: 0.43 秒。
PROC EXPORT data=temp
outfile="temp.csv" dbms=csv replace;
选择其他选项时,快速运行时间和简单的,即装即用的灵活性。话虽如此,它并不是定制最强的
第二种方法:带有打印程序的ODS 。运行时间: 14.09 秒。
ODS csv file="temp.csv";
PROC PRINT data=temp noobs;
RUN;
ods csv close;
对于大多数用例,此方法是三者中最差的选项,尽管有一些特殊用例。对于先前编写的过程的临时输出是很好的,特别是如果您希望输出保留在lst文件中(如果它不是太大)。当您想要将另一个过程(例如,复杂的tabulate
)转换为文件而无需进一步操作时,它也可能很有用。如果您不需要在lst文件中打印出来,请关闭您的商家信息(ods listing close
),否则这将需要更长时间。
第三种方法:文件声明。运行时间: 0.06 秒。
DATA _null_;
FILE "temp.csv ";
SET temp;
put (_all_) (',');
RUN;
虽然这种方法的性能不错,但它并不直观,看起来很混乱。如上所述,您可以更好地控制输出,并且它具有最快的运行时间。
答案 3 :(得分:1)
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
查找变量。
在以下示例中,由于仅保留了两个变量{{1},因此仅从Name
中提取了Height
(varnum = 1)和SASHELP.CLASS
(varnum = 4) }是2,但是如果我们以num为上限迭代一个循环,则会错过nvars
,因为它的Height
是4:
varnum
有两种选择:
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)
可能很有意义,或者如果没有太多,则显式列出变量。这只是说明可以做什么。