有效地将SAS数据集转换为CSV

时间:2010-09-14 17:14:16

标签: csv sas

有谁能告诉我以编程方式将SAS数据集转换为CSV文件的最快方法是什么。我知道我可以使用数据步骤并输出到文件等。但这是唯一的方法吗?

谢谢, 阿德南。

4 个答案:

答案 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)

可以使它与keepdrop数据集选项一起使用(令人惊讶),尽管不幸的是,当使用open()nvars“打开”数据集时属性遵循keepdrop之后的新变量数量,但是varlabelvarname函数仍然使用其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) 可能很有意义,或者如果没有太多,则显式列出变量。这只是说明可以做什么。