IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAS Base Discussion :

Fonction index ou find sur une variable multiple


Sujet :

SAS Base

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Juillet 2010
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 199
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre émérite
    Avatar de steelspirit
    Homme Profil pro
    SAS discute
    Inscrit en
    Janvier 2008
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SAS discute
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 472
    Par défaut
    Bonjour,
    Rien de tel que les expressions régulières et les fonctions PRX pour résoudre ce genre de problème !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  3. #3
    Membre émérite
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    Janvier 2012
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Par défaut
    Hello,

    une truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  4. #4
    Membre éprouvé
    Inscrit en
    Juillet 2010
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 199
    Par défaut
    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..

  5. #5
    Membre émérite
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    Janvier 2012
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Par défaut
    comme ça ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    data d;
      set a;
      c=count_mots(a,';',1);
    run;

  6. #6
    Membre éprouvé
    Inscrit en
    Juillet 2010
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 199
    Par défaut
    Merci edward ,

    ça fonctionne très bien cet outil.

    Une question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Fonction mb_substr() sur une variable contenant un $
    Par Super_carotte dans le forum Langage
    Réponses: 10
    Dernier message: 26/06/2014, 09h10
  2. agir sur une variable en fonction du choix du menu
    Par Alegreg dans le forum ASP.NET
    Réponses: 3
    Dernier message: 27/04/2011, 21h51
  3. Réponses: 3
    Dernier message: 22/09/2009, 21h34
  4. Test multiple sur une variable non définie
    Par Rei Angelus dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 12/12/2007, 22h01
  5. Réponses: 2
    Dernier message: 18/06/2007, 15h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo