プログラムでSASデータセットをCSVファイルに変換する最速の方法を教えてください。データステップを使用してファイルなどに出力できることがわかっています。 ?
ありがとう、アドナン。
これらの線に沿って何か?
proc export data=sashelp.class
outfile='c:\temp\sashelp class.csv'
dbms=csv
replace;
run;
SASデータセットの.CSVファイルを作成する5つの異なる方法。
参照 http://studysas.blogspot.com/2009/02/how-to-create-comma-separated-file-csv.html
ここでの回答は、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;
この方法のパフォーマンスは悪くありませんが、直感的ではなく、混乱を招きます。ただし、上記のように、出力をより細かく制御でき、すべての実行時間が最短になります。
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
_を使用するか、変数があまりない場合は変数を明示的にリストすることはおそらく意味があります。これは何ができるかを示しています。