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

Macro Discussion :

Recherche chaîne caractère dans plusieurs variables


Sujet :

Macro

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Statisticien
    Inscrit en
    Juin 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Juin 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Recherche chaîne caractère dans plusieurs variables
    Bonjour à tous,

    Je suis en train d'écrire une macro pour alléger mes programmes. Je dois chercher une chaîne de caractères (qui correspond à un code de médicaments) dans plusieurs variables, et si le code est trouvé alors ma nouvelle variable prend la valeur 1. Autrement, elle est égale à 0.
    J'ai essayé d'utilisé la macro %INDEX mais cela ne fonctionne pas.
    Voici ma tentative :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    %macro medicament(name) ;
    	IF %index(ATC_MED01,&name.) > 0 OR  %index(ATC_MED02,&name.) > 0 OR %index(ATC_MED03,'&name.') > 0 OR %index(ATC_MED04,'&name.') > 0 
    			OR %index(ATC_MED05,&name.) > 0 OR %index(ATC_MED06,&name.) > 0 OR %index(ATC_MED07,&name.) > 0 OR %index(ATC_MED08,&name.) > 0
    			OR %index(ATC_MED09,&name.) > 0 OR %index(ATC_MED10,&name.) > 0 OR %index(ATC_MED11,&name.) > 0 OR %index(ATC_MED12,&name.) > 0
    			OR %index(ATC_MED13,&name.) > 0 OR %index(ATC_MED14,&name.) > 0 OR %index(ATC_MED15,&name.) > 0 OR %index(ATC_MED16,&name.) > 0
    			OR %index(ATC_MED17,&name.) > 0 OR %index(ATC_MED18,&name.) > 0 OR %index(ATC_MED19,&name.) > 0 OR %index(ATC_MED20,&name.) > 0
    			OR %index(ATC_MED21,&name.) > 0 OR %index(ATC_MED22,&name.) > 0 OR %index(ATC_MED23,&name.) > 0 OR %index(ATC_MED24,&name.) > 0
    			OR %index(ATC_MED25,&name.) > 0 OR %index(ATC_MED26,&name.) > 0 OR %index(ATC_MED27,&name.) > 0 OR %index(ATC_MED28,&name.) > 0
    			OR %index(ATC_MED29,&name.) > 0 OR %index(ATC_MED30,&name.) > 0 OR %index(ATC_MED31,&name.) > 0 OR %index(ATC_Q519_1,&name.) > 0
    			OR %index(ATC_Q519_2,&name.) > 0 OR %index(ATC_Q519_3,&name.) > 0 OR %index(ATC_Q519_4,&name.) > 0 OR %index(ATC_Q519_5,&name.) > 0 
    			THEN MED_&name. = 1 ;
    		ELSE MED_&name. = 0 ;
    %mend ;
    En sachant que la variable name peut avoir des valeurs comme H01, C02 ...

    Je vous remercie d'avance

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 482
    Points : 1 547
    Points
    1 547
    Par défaut
    Bonjour,
    Une solution à l'aide de la routine CALL EXECUTE est également possible :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    /* Créer une table CODE contenant les valeurs à détecter dans les variables */  
     
    data Code ;
    input Val $ ;
    cards ;
    H01
    C02
    M03
    ; run ;  
     
    Data Test ;
    input (ATC_MED01 ATC_MED20 ATC_MED29 ATC_MED31 ATC_Q519 ATC_Q522) (6*$5.) ;
    cards ;
    HH22 KK02 MM20 YY44 OO74 PP20
    GG11 H01  LL11 EE03 II04 M03 
    QQ03 FF85 C02C KK02 MM20 OO74
    MM20 YY44 II04 H01  OO74 PP20
    HH22 KK02 MM20 YY44 OO74 MM03
    ; run ; 
     
    /* Créer une macro variable “ListVars”  */
     
    proc sql noprint ;
    select name
    into :ListVars separated by ' ' 
    from dictionary.columns
    where libname="WORK" and memname="TEST" ; 
    quit ; 	
     
    /* A l’aide de la call execute on obtient le résultat souhaité */ 
     
    data _null_ ;
    set Code end=fin ; 	 
    if _n_=1 then 
    call execute('data Resultat (drop=i) ; set Test ; array Arr(*) &ListVars. ; ') ;
    call execute('
     MED_'||strip(val)||'=0 ; 
     do i=1 to dim(Arr) ;  		 
     if index( upcase(Arr(i)), "'||upcase(strip(Val))||'" ) > 0 then  MED_'||strip(val)||'=1 ;      
     end ; 		') ;                    
    if fin then call execute('run ;') ;   
    run ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
            ATC_     ATC_     ATC_     ATC_
     Obs    MED01    MED20    MED29    MED31    ATC_Q519    ATC_Q522    MED_H01    MED_C02   MED_M03
     
      1     HH22     KK02     MM20     YY44       OO74        PP20         0          0          0
      2     GG11     H01      LL11     EE03       II04        M03          1          0          1
      3     QQ03     FF85     C02C     KK02       MM20        OO74         0          1          0
      4     MM20     YY44     II04     H01        OO74        PP20         1          0          0
      5     HH22     KK02     MM20     YY44       OO74        MM03         0          0          1
    Cordialement Ward

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Statisticien
    Inscrit en
    Juin 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Juin 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour Wald,

    Merci pour votre aide. Malheureusement, la proposition de code que vous avez faite ne fonctionne pas.
    Voici le message d'erreur que j'obtiens :

    Nom : 2019-04-15 08_43_32-IMPACTLU 20190212 - SAS Enterprise Guide.png
Affichages : 563
Taille : 8,9 Ko

    Merci d'avance pour votre aide

  4. #4
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Par rapport au code initial, la même chose avec la fonction INDEX au lieu de la macro-fonction %INDEX devrait fonctionner. %INDEX permet de rechercher un texte dans la valeur d'une macro-variable, INDEX cherche un texte (qui peut être une macro-variable) dans la valeur d'une variable SAS.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF index(ATC_MED01,"&name.") > 0
    Bon courage.
    Olivier

  5. #5
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Je te propose cette solution:
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    Data Test ;
    input (ATC_MED01 ATC_MED20 ATC_MED29 ATC_MED31 ATC_Q519 ATC_Q522) ($5.) ;
    cards ;
    HH22 KK02 MM20 YY44 OO74 H01
    GG11 H01  LL11 EE03 II04 M03 
    QQ03 FF85 C02C KK02 MM20 OO74
    MM20 YY44 II04 H01  OO74 PP20
    HH21 KK02 MM20 YY44 OO74 MM03
    ; run ;
     
     
     
    data test1(drop=re start stop ATC_MED startposn len n ATC_MED   i);
     set test;
     array var _character_;
     ATC_MED=catx('|',of var(*));
     if _n_=1 then do;
     retain re;
     re = prxparse('/HH22|OO74|H01/');
     
     end;
     array nvar  HH22 OO74  H01;
     start = 1;
     stop = length(ATC_MED);
     call prxnext(re,start,stop,ATC_MED,startposn,len);
     do i = 1 to 3 while(startposn > 0);
     n= substr(ATC_MED,startposn,len);
     if n='HH22' then HH22=1;
     if n='OO74' then OO74=1;
     if n='H01' then H01=1;
     call prxnext(re,start,stop,ATC_MED,startposn,len);
     if HH22=. then HH22=0;
     if OO74=. then OO74=0;
     if H01=. then H01=0;
     end;
     run;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

Discussions similaires

  1. [Python 3.X] Script modifiant une chaîne de caractères dans plusieurs fichiers.
    Par Julien698 dans le forum Général Python
    Réponses: 4
    Dernier message: 09/09/2014, 13h41
  2. Sélection d'une chaîne de caractère dans une variable
    Par ca_adrien dans le forum SAS Base
    Réponses: 2
    Dernier message: 05/06/2013, 14h46
  3. Rechercher/remplacer une chaine de caractères dans plusieurs fichiers
    Par _shuriken_ dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 31/07/2011, 20h06
  4. Recherche de caractère dans une chaîne
    Par vva dans le forum ASP
    Réponses: 2
    Dernier message: 24/09/2008, 21h02
  5. rechercher un caractère dans un chaîne
    Par gbzmt dans le forum VBA Access
    Réponses: 2
    Dernier message: 12/04/2008, 09h58

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