web-dev-qa-db-fra.com

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

Existe-t-il des instructions\fonctions capables d'obtenir le nom des variables? De préférence, les placer dans une colonne d'un autre ensemble de données, d'un champ de texte ou d'une variable macro.

Par exemple.

- Jeu de données 1

Name age sex

    Jk   14   F
    FH   34   M
  • Jeu de données attendu

    Var_name_of_dataset1

    Name
    age
    sex
    

PS: Je connais un énoncé: select into, qui fait ça correctement. Il peut lire la valeur d’une colonne dans un champ avec des séparateurs personnalisés, et souhaite donc qu’il existe des méthodes similaires pour lire les noms de colonne dans un champ ou une colonne.

Merci

12
mj023119

PROC CONTENTS serait le moyen le plus rapide d'obtenir cette information dans un jeu de données. Les noms de colonne peuvent être trouvés dans la colonne NAME.

proc contents data=sashelp.class out=contents noprint;
run;
25
Laurent de Walick

Vous pouvez également utiliser un datastep et des fonctions de tableau, par exemple.

Les noms de données. _CHARACTER_; 
 
 Do i = 1 to dim (n); 
 Vname = vname (n {i}); 
 Sortie; 
 End ; 
 do i = 1 to dim (c); 
 vname = vname (c {i}); 
 sortie; 
 end; 
 courir ;
19
Chris J
%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 variable macro appelée & vlist qui contiendra les noms de toutes les variables de votre jeu de données, séparés par un espace. Si vous voulez des virgules entre les noms de variables, tout ce que vous avez à faire est de changer la valeur "séparés par" de "" en "," L'utilisation de la fonction upcase dans l'instruction where évite les problèmes de transmission du nom du jeu de données dans le mauvais cas. La déclaration globale est nécessaire car la variable macro créée ne sera pas nécessairement disponible en dehors de la macro sans la définir comme globale.

7
purnendumaity

Légèrement modifié depuis SAS aide et documentation.

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

Ensuite, nous conservons les données de casse et d'ordre sans ordre, même si les chiffres et les caractères sont mélangés.

2
Jan Brentved

Je ne suis pas sûr que l'affirmation de Rawfocus selon laquelle la lecture des tables de dictionnaire interroge toutes les bibliothèques soit vraie. Si l'exemple avait été utilisé, sashelp.vcolumn aurait alors été utilisé. Cette approche est très lente et permet d'accéder à 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 à dictionary.columns est la plus rapide des méthodes décrites ici. Évidemment, le code macrotisé fonctionnerait sans la macro, mais l’intérêt de la macro ici est, à mon avis, d’utilité; placez le code dans votre bibliothèque de macros préférée et vous n’aurez plus jamais besoin d’y repenser.

0
Smithers