Vous avez une variable composée d’un ou plusieurs mots pour chaque observation, le tout séparé par des espaces, des virgules ou autre. Et vous voulez savoir combien il y a de mots. Avec SAS 9, il est très rapide de trouver le nombre de mots. Avec SAS 8.2, il faut pallier à l’absence de la fonction COUNT. Dans les deux cas, l’idée est la même : on compte les délimiteurs et on ajoute 1.
Prenons le cas des espaces. Dans un premier temps, on enlève les blancs de début et de fin de chaîne. Puis on enlève les doublons entre les mots. Enfin on compte les espaces restants. Il faudra aussi tenir compte du fait qu’une observation puisse ne contenir aucune valeur.
Voici les données qui serviront d’exemple :
data ds_orig;
x=‘ AB CD GH ‘;
output;
x=‘ ‘;
output;
x=‘AB ‘;
output;
run;
1. Avec SAS 9, un calcul rapide : il faudra faire appel à:
-
la fonction STRIP pour les blancs aux extrémités,
-
la fonction COMPBL pour enlever les blancs doublons,
-
la fonction COUNT pour compter le nombre d’occurrence d’un caractère donné,
-
la fonction MISSING ou un simple = ‘ ‘ pour savoir si la chaîne est vide.
Voici un exemple avec des espaces pour délimiteur.
data sas9 ;
set ds_orig;
if x = ‘ ‘ then nb_mots = 0;
else nb_mots=count(compbl(strip(x)),‘ ‘) + 1;
run;
2. Avec SAS 8.2, il faut contourner l’absence de la fonction COUNT: il existe plusieurs options dont celle-ci utilisant une boucle DO WHILE:
-
Les fonctions TRIM et LEFT remplacent la fonction STRIP.
-
Les fonctions COMPLB et MISSING restent valide.
-
Une boucle remplacera la fonction COUNT.
On extrait le 1er mot de la chaîne, puis le 2nd, etc. via la fonction SCAN. Si la valeur trouvée est une valeur manquante, alors le nombre de mots est égal au nombre du boucles sans valeur manquante, c’est-à-dire le nombre de boucles actuel moins 1. Le compteur, ici nommé i, est réinitialisé pour arrêter la boucle DO WHILE.
data sas8_2;
set ds_orig;
if missing(x)then cnt_mots=0;
else
do;
z=compbl(trim(left(x)));
i=1;
do until (i=0);
if missing(scan(z,i,‘ ‘))then
do;
cnt_mots=i-1;i=->1;
end;
i=i+1;
end;
drop i z;
end;
run;