Comment lire les noms de variables dans un ensemble de données SAS?

existe-il des instructionsfonctions susceptibles d'obtenir le nom des variables? Préférablement les mettre dans une colonne d'un autre ensemble de données, un champ de texte ou une variable macro.

E. G.

- ensemble de données 1

Name age sex

    Jk   14   F
    FH   34   M
  • données attendues

    Var_name_of_dataset1

    Name
    age
    sex
    

PS: je connais une instruction: select into, qui fait sth de manière pertinente Il peut lire la valeur d'une colonne dans un champ avec separetors personnalisés, et souhaitent donc qu'il y ait des façons similaires de lire les noms de colonne dans un champ ou une colonne.

Merci

12
demandé sur mj023119 2011-03-21 11:05:09

5 réponses

le contenu de PROC serait le moyen le plus rapide pour obtenir cette information dans un ensemble de données. Les noms de colonne peuvent être trouvés dans le nom de colonne.

proc contents data=sashelp.class out=contents noprint;
run;
25
répondu Laurent de Walick 2011-03-21 09:35:22

Vous pouvez également utiliser des fonctions de type "datastep" et "array", par exemple

data colnames ;
  set sashelp.class (obs=1) ;

  array n{*} _NUMERIC_ ;
  array c{*} _CHARACTER_ ;

  do i = 1 to dim(n) ;
    vname = vname(n{i}) ;
    output ;
  end ;
  do i = 1 to dim(c) ;
    vname = vname(c{i}) ;
    output ;
  end ;
run ;
19
répondu Chris J 2011-03-21 11:52:03
%macro getvars(dsn);
 %global vlist;
 proc sql;
 select name into :vlist separated by ' '
  from dictionary.columns
  where memname=upcase("&dsn");
 quit;
%mend;

cela crée une macro variable appelée &vlist qui contiendra les noms de toutes les variables de votre ensemble de données, séparées par un espace. Si vous voulez des virgules entre les noms de variables, Tout ce que vous avez à faire est de changer le 'séparé par la valeur' de '' à ', '. L'utilisation de la fonction upcase dans la déclaration where évite les problèmes avec quelqu'un qui passe le nom de l'ensemble de données dans le mauvais cas. L'énoncé global est nécessaire puisque la variable macro créée ne sera pas nécessairement disponible en dehors de la macro sans la définir comme global

7
répondu purnendumaity 2015-01-14 13:39:47

légèrement modifié par rapport à L'AIDE et à la documentation du SAS.

%macro names(dsid);
  %let dsid=%sysfunc(open(&dsid, i));
  %let num=%sysfunc(attrn(&dsid,nvars));
  %let varlist=;
  %do i=1 %to &num  ;
    %let varlist=&varlist %sysfunc(varname(&dsid, &i));
  %end;
  %let rc = %sysfunc(close(&dsid)); /*edit by Moody_Mudskipper: omitting this line will lock the dataset */
  %put varlist=&varlist;
%mend names;

%names(sasuser.class) ;

alors nous conservons le cas et l'ordre des données off, même si numérique et le caractère sont mélangés.

2
répondu Jan Brentved 2018-01-23 11:21:36

Je ne suis pas sûr que L'assertion de Rawfocus que la lecture de tables de dictionnaire interroge toutes les bibliothèques est vraie, avait l'exemple utilisé sashelp.vcolumn au lieu de cela il serait vrai que cette approche est très lente et accède à toutes les bibliothèques allouées. (Vous pouvez le prouver avec L'option système SAS RTRACE.)

je suis d'avis qu'une requête sql à un dictionnaire.des colonnes est la plus rapide des méthodes décrites ici. Évidemment le code macrotisé fonctionnerait sans la macro mais le point de la macro ici est je pense comme un utilitaire; mettez le code dans votre macro bibliothèque préférée et vous n'avez pas besoin d'y penser à nouveau.

0
répondu Smithers 2015-06-09 09:29:11