web-dev-qa-db-ja.com

SASデータセットをCSVに効率的に変換する

プログラムでSASデータセットをCSVファイルに変換する最速の方法を教えてください。データステップを使用してファイルなどに出力できることがわかっています。 ?

ありがとう、アドナン。

19
Adnan

これらの線に沿って何か?

proc export data=sashelp.class
    outfile='c:\temp\sashelp class.csv'
    dbms=csv
    replace;
run;
28
rkoopmann

SASデータセットの.CSVファイルを作成する5つの異なる方法。

参照 http://studysas.blogspot.com/2009/02/how-to-create-comma-separated-file-csv.html

10
user466405

ここでの回答は、csvを作成する多くの方法を扱っていますが、これらの方法の効率は必ずしも必要ではありません。 100,000行と5列のサンプルデータセット(temp)を作成して、sasデータセットをtemp.csvという名前のcsvにエクスポートする方法をテストおよび比較します。


最初の方法:エクスポート手順。実行時間:.4秒。

PROC EXPORT data=temp 
     outfile="temp.csv" dbms=csv replace;

他のオプションを選択するときのクイック実行時間とシンプルですぐに使える柔軟性。とはいえ、カスタマイズには最強ではありません


2番目の方法:印刷手順付きODS。実行時間:14.09秒。

ODS csv file="temp.csv";
PROC PRINT data=temp noobs;
RUN;
ods csv close;

この方法は、いくつかの特別なユースケースがありますが、ほとんどのユースケースの3つの中で最悪のオプションです。特に、出力をlstファイルに残したい場合(大きすぎない場合)、以前に作成されたプロシージャの一時的な出力に適しています。また、別のプロシージャ(たとえば、複雑なtabulate)をさらに操作せずにファイルに変換する場合にも役立ちます。 lstファイルに印刷する必要がない場合は、リストを閉じてください(ods listing close)。そうしないと、かなり長い時間がかかります。


3番目の方法:ファイルステートメント。実行時間:.06秒。

DATA _null_;
    FILE "temp.csv ";
    SET temp;
    put (_all_) (',');
RUN;

この方法のパフォーマンスは悪くありませんが、直感的ではなく、混乱を招きます。ただし、上記のように、出力をより細かく制御でき、すべての実行時間が最短になります。

5
Anna

変更された_data _NULL__アプローチ

以下は、最初のデータステップでヘッダー行をファイルに書き出し、その後、2番目のデータステップでデータ行を使用して同じファイルを書き込み続ける_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を使用して変数を探します。

次の例では、Name(varnum = 1)とHeight(varnum = 4)のみが_SASHELP.CLASS_から抽出されます。これは、2つの変数のみが保持されるためです。nvarsは2ですが、上限は、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
_

次の2つのオプションがあります。

  • 最初のパスのデータセットオプションを削除して、真のnvars値を抽出します
  • numの代わりに非常に大きな数値を使用しますが、これによりログに多くの_'invalid'_のメモが作成されます

これは最初のアプローチで、open関数への2つの呼び出しが必要です。

_%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_を使用するか、変数があまりない場合は変数を明示的にリストすることはおそらく意味があります。これは何ができるかを示しています。

1
mjsqu