Quelqu'un peut-il me dire quel est le moyen le plus rapide de convertir par programme un ensemble de données SAS en fichier CSV. Je sais que je peux utiliser une étape de données et la sortie dans un fichier, etc. Mais est-ce la seule façon ?
Merci, Adnan.
quelque chose dans ce sens?
proc export data=sashelp.class
outfile='c:\temp\sashelp class.csv'
dbms=csv
replace;
run;
5 façons différentes de créer un fichier .CSV d'un ensemble de données SAS.
se référer http://studysas.blogspot.com/2009/02/how-to-create-comma-separated-file-csv.html
Les réponses ici ont abordé de nombreuses façons de créer un csv, mais pas nécessairement l'efficacité de ces méthodes. Je crée un exemple de jeu de données (temp
) avec 100 000 lignes et cinq colonnes pour tester et comparer les méthodes d'exportation du jeu de données sas vers un fichier csv nommé temp.csv
.
La première méthode: La Procédure d'exportation. Temps d'exécution: ,4 secondes.
PROC EXPORT data=temp
outfile="temp.csv" dbms=csv replace;
Temps d'exécution rapide et flexibilité simple dans la boîte lors du choix d'autres options. Cela dit, ce n'est pas le plus fort pour la personnalisation
La deuxième méthode: ODS avec procédure d'impression. Temps d'exécution: 14.09 secondes.
ODS csv file="temp.csv";
PROC PRINT data=temp noobs;
RUN;
ods csv close;
Cette méthode est la pire option sur les trois pour la plupart des cas d'utilisation, bien qu'il existe quelques cas d'utilisation spéciaux. C'est bien pour la sortie temporaire de procédures écrites précédemment, surtout si vous voulez que la sortie reste dans le fichier lst (si elle n'est pas trop grande). Il peut également être utile lorsque vous souhaitez convertir une autre procédure (par exemple, un tabulate
) compliqué en fichier sans autre manipulation. Si vous n'avez pas besoin de l'impression dans le fichier lst, fermez votre liste (ods listing close
) ou cela prendra beaucoup, beaucoup plus de temps.
La troisième méthode: File Statement. Temps d'exécution: ,06 secondes.
DATA _null_;
FILE "temp.csv ";
SET temp;
put (_all_) (',');
RUN;
Bien que les performances de cette méthode ne soient pas mauvaises, elles ne sont pas intuitives et semblent confuses. Comme mentionné ci-dessus cependant, vous auriez plus de contrôle sur la sortie, et elle a le temps d'exécution le plus rapide de tous.
data _NULL_
ModifiéeVoici une modification de l'approche data _NULL_
Qui écrit les lignes d'en-tête dans le fichier dans le premier datastep, puis continue d'écrire le même fichier avec les lignes de données dans le second datastep.
%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)
Il peut être fait pour fonctionner avec les options de jeu de données keep
et drop
(de façon surprenante), bien que, malheureusement, lorsqu'un ensemble de données est "ouvert" à l'aide de open()
, le nvars
l'attribut respecte le nouveau nombre de variables après keep
ou drop
, mais les fonctions varlabel
et varname
recherchent toujours les variables en utilisant leur varnum
.
Dans l'exemple suivant, seuls Name
(varnum = 1) et Height
(varnum = 4) sont extraits de SASHELP.CLASS
, Car seules deux variables sont conservées, nvars
est 2, mais si nous itérons sur une boucle avec num comme borne supérieure, nous manquons Height
, car son varnum
est 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
Il y a deux options:
nvars
en supprimant les options de l'ensemble de données pour la première passenum
, bien que cela mène à beaucoup de notes 'invalid'
Dans le journalIl s'agit de la première approche, nécessitant deux appels à la fonction 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)
Après avoir écrit tout cela, il est probablement judicieux d'utiliser PROC EXPORT
Dans la plupart des cas, ou de répertorier explicitement les variables s'il n'y en a pas beaucoup. Cela montre simplement ce qui peut être fait.