web-dev-qa-db-fra.com

Convertissez efficacement un ensemble de données SAS en CSV

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.

21
Adnan

quelque chose dans ce sens?

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

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

11
user466405

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.

6
Anna

Approche data _NULL_ Modifiée

Voici 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:

  • Extraire la vraie valeur nvars en supprimant les options de l'ensemble de données pour la première passe
  • Utilisez un nombre vraiment élevé au lieu de num, bien que cela mène à beaucoup de notes 'invalid' Dans le journal

Il 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.

2
mjsqu