Précédent   Forum du club des développeurs et IT Pro > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 22/02/2013, 11h42   #1
mohamed_
Membre du Club
 
Inscription : juillet 2010
Messages : 113
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 113
Points : 58
Points : 58
Par défaut Fonction index ou find sur une variable multiple

Bonjour,

je cherche à faire un comptage du nombre de 1, 2.. dans une variable à reponse multiple avec un séparateur ;
j'utilise pour cela la fonction index.
Seulement qd la variable contient 10 ou 216 l'index(a,'1') me retourne une valeur positive. Or je ne veux retrouver que '1' tout seul.
Un petit exemple :

Code :
1
2
3
4
5
6
7
8
9
10
DATA a ;
format a $10. ;
a="2;10";output ;
a = "23;31";output ;
a= "25;1;216"; output ;
 run ;
DATA b ;
SET a ;
y=find(a,'1','i') ne 0 ;
run ;
J'ai essayé avec la fonction find mais ça me donne le même résultat.
Est ce que vous avez déjà rencontré ce cas ? Si oui, comment l'avez vous résolu ?
Je ne vois pas comment traiter ces variables.
mohamed_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 13h30   #2
steelspirit
Membre expérimenté
 
Avatar de steelspirit
 
Inscription : janvier 2008
Messages : 436
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2008
Messages : 436
Points : 575
Points : 575
Envoyer un message via MSN à steelspirit
Bonjour,
Rien de tel que les expressions régulières et les fonctions PRX pour résoudre ce genre de problème !
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
DATA a ;
format a $10. ;
a="2;10";output ;
a = "23;31";output ;
a= "25;1;216"; output ;
 run ;
 
  DATA test;
   ExpressionID = prxparse('/1/');
   SET a;
   text=a;
   start = 1;
   stop = length(text);
   compteur=0;
   call prxnext(ExpressionID, start, stop, text, position, length);
      do while (position > 0);
         found = substr(text, position, length);
         call prxnext(ExpressionID, start, stop, text, position, length);
		 compteur+1;
      end;
      put text= compteur=;
run;
__________________
Avant de poser votre question, n'oubliez pas :
FAQ, SAS DOC et de ce forum
steelspirit est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/02/2013, 13h39   #3
edward carnby
Membre éprouvé
 
Homme Ludovic Le Breton
Statisticien/développeur BI
Inscription : janvier 2012
Messages : 177
Détails du profil
Informations personnelles :
Nom : Homme Ludovic Le Breton
Âge : 38
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Statisticien/développeur BI
Secteur : Transports

Informations forums :
Inscription : janvier 2012
Messages : 177
Points : 464
Points : 464
Hello,

une truc comme ça :

Code :
1
2
3
4
5
6
7
8
9
10
 
DATA b (DROP=i nbmots);
  SET a;
  do;
     nbmots=count(a,';')+1;
     do i = 1 TO nbmots;
	IF scan(a,i) = 1 then count+1;
	end;
     end;
run;
edward carnby est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/02/2013, 16h58   #4
mohamed_
Membre du Club
 
Inscription : juillet 2010
Messages : 113
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 113
Points : 58
Points : 58
bonjour,

Merci pour vos réponses.
La solution en pearl semble bien compliquée.

La solution d Edouard fonctionne bien.
Cependant j'aimerai pouvoir faire ça à partir d'une fonction.
Est-ce que je ne peux pas transformer ce code pour en faire une nouvelle fonction indexbis par exemple à partir de la fcmp.

Je sais que le proc fcmp permet de créer des fonctions à partir de code mais je ne l'ai jamais fait..
mohamed_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 17h44   #5
edward carnby
Membre éprouvé
 
Homme Ludovic Le Breton
Statisticien/développeur BI
Inscription : janvier 2012
Messages : 177
Détails du profil
Informations personnelles :
Nom : Homme Ludovic Le Breton
Âge : 38
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Statisticien/développeur BI
Secteur : Transports

Informations forums :
Inscription : janvier 2012
Messages : 177
Points : 464
Points : 464
comme ça ...

Code :
1
2
3
4
5
6
7
8
9
10
 
proc fcmp outlib=work.functions.samples;
FUNCTION count_mots(var$,separator$,word);
   	do i = 1 TO (count(var,separator)+1);
		IF scan(var,i) = word then count+1;
		end;
RETURN(count);
endsub;
run;
options cmplib=work.functions;
où :
var = variable sur laquelle appliquer la fonction
separator = le séparateur de mot
word = le mot cherché

puis appel de la fonction ...
Code :
1
2
3
4
5
 
DATA d;
  SET a;
  c=count_mots(a,';',1);
run;
edward carnby est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 18h02   #6
mohamed_
Membre du Club
 
Inscription : juillet 2010
Messages : 113
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 113
Points : 58
Points : 58
Merci edward ,

ça fonctionne très bien cet outil.

Une question :
Code :
outlib=work.functions.samples
est un catalogue de fonction qui est dans la work un peu comme dans une proc format ?

Si oui, alors je pourrais la stocker ds le répertoire où j'ai mes formats et je pourrais l'appeler comme n'importe qu'elle autre fonction de sas.
mohamed_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h56.


 
 
 
 
Partenaires

Hébergement Web