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
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;
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 ;
%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
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.
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.