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 :

La variable contient-elle la chaine de caractère 'dil' ?


Sujet :

Macro

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 7
    Points
    7
    Par défaut La variable contient-elle la chaine de caractère 'dil' ?
    Bonjour,

    Je suis à la recherche d'une aide au sein d'une macro.
    Je travaille depuis un fichier &data dans lequel j'ai une variable qui s'appelle nom contenant des chaines de caratères diverses, et une variable valeur contenant la valeur de 'nom'.

    Lorsque cette variable "nom" contient "predil" par exemple en début de mot, je voudrais créer une macro variable "P" contenant la valeur de prédil, et si aucun nom ne contient "predil" alors P='.'.

    Mon problème c'est que lorsque je travaille avec substr (avec un where), j'arrive à faire ce que je veux. Mais je n'arrive pas à appliquer le substr avec un if.

    Voici mon code: (deux cas : le premier me récupère les macro variables dil, l'autre impose une condition, et c'est cette deuxièmpe partie qui bloque)

    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
    data dilution&j;
    	set &data;
    	where substr(nom,1,3)="dil" and SampleID=&type ;
    	call symput (nom,valeur); 	/* Création de macro-variables */
    run;
     
    data _NULL_;
    	set &data;
    	%let var=%substr(&data.nom,1,6) ;
    	%put &var;
    	%if var="predil" and SampleID=&type %then %do;
    		call symput ("predil",valeur);
    	%end;
    	%else %do;
    		call symput ("predil",'.');
    	%end;
    run;

    En espérant que ma demande soit claire... Je cherche à vérifier qu'une variable contienne une chaine de caractère ou non, et suivant ce cas, adapter mes requêtes.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 113
    Points : 107
    Points
    107
    Par défaut
    je n'ai pas trop compris ta demande mais il y a déjà quelques problèmes dans ton code à mon avis.
    Les macro-variable que tu crées dans tes étapes data son écrasées à chaque nouvelle ligne de ta table. Sauf dans ta 1ere étape data, où là ton dépendra des valeurs de la variable nom.
    Ex :
    table, 2 variables var1 et var2
    valeur1 x
    valeur2 y
    valeur1 z
    Si tu fais un call symput du type call symput(var1, var2), alors tu vas créer deux macro-variables valeur1 (tu garderas uniquement la valeur z) et une valeur2.

    dans ta deuxième étape simplifie, tu n'as pas besoin de passer en macro-language tes if car tu travailles sur des variables de ta table.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    data _NULL_;
      set &data;
      if substr(nom,1,6) ="predil" and SampleID=&type then do;
        call symput ("predil",valeur);
      end;
      else do;
        call symput ("predil",'.');
      end;
    run;
    Mais là encore il y aura une seule macro-variable predil de créée...elle sera toujours écrasée.

    Solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call symput("predil" !! trim(put(_n_,best. -L)), valeur)
    Cela ajoutera un indice tu auras donc predil1, predil2...et elles ne seront plus écraser.
    si ça ne répond pas à ta question, n'hésite pas.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Je suis d'accord avec ta remarque consistant à dire que je vais écraser ma macro variable. Mais c'est justement ce que je voulais : suivant dans le cas où je me trouvais (et ici ma condition était la présence d'une certain nom ou pas) je voulais donner une valeur différente à ma macro variable mais if + substr ca ne compile pas !

    Du coup, en ce qui concerne mon projet, j'ai résolu mon problème tout simplement en me résignant à passer par un where, sachant que les deux conditions (nom = volume et nom = predil) ne peuvent survenir ensemble.

    ca donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    data paramt&i; 
    	set &data;
    	where (substr(nom,1,6)="predil" and SampleID=&type) or
    	(substr(nom,1,6)="volume" and SampleID=&type);
    	dilution=&&dil&i;
    	rename nom=prtname valeur=prtvalue ;
    run;
    Du coup je passe par une table intermédiaire.

    Cependant la question de %if + SUBSTR () reste en suspend, et je ne comprends d'où vient l'erreur. Peut-on utiliser IF + Substr () car substr est utilisé pour remplacer une chaine de caractère ...

  4. #4
    Membre du Club

    Inscrit en
    Mars 2008
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 33
    Points : 53
    Points
    53
    Par défaut
    Bonjour Juliep

    Si je puis me permettre, substr sert à tronquer une chaine de caractère et ne s'utilise au conditionnelle qu'avec where.
    Si tu veux conditionner un résultat par un if en cherchant une sous-chaine de caractère dans une chaine de caractère, il faut alors passer par contains et si tu veux remplacer une occurrence de caractère alors c'est tranwrd qu'il faut utiliser.

    Bon courage

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 113
    Points : 107
    Points
    107
    Par défaut
    A mon avis tu te mélanges avec les double quote.
    Sans double quote

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    %let aaa = abc;
    %macro a;
    %if %substr(&aaa,1,1) = a %then %do;
      %put oui;
    %end;
    %else %do;
      %put non;
    %end;
    %mend;
    %a;
    Avec double quote
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    %let aaa = bbc;
    %macro a;
    %if "%substr(&aaa,1,1)" = "a" %then %do;
      %put oui;
    %end;
    %else %do;
      %put non;
    %end;
    %mend;
    %a;
    Ne compilera pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    %let aaa = bbc;
    %macro a;
    %if %substr("&aaa",1,1) = "a" %then %do;
      %put oui;
    %end;
    %else %do;
      %put non;
    %end;
    %mend;
    %a;

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 113
    Points : 107
    Points
    107
    Par défaut
    J'ai oublié de précisé que le %sibstr va récupérer du texte.
    Donc si tu écris %substr("aaaa",1,1) alors cela va récupérer la chaîne de caractère ". D'où un problème de compilation.
    Enfin si ton problème venait de là.
    Mais le %if et le %substr peuvent être utilisé ensemble sans problème

  7. #7
    Membre du Club

    Inscrit en
    Mars 2008
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 33
    Points : 53
    Points
    53
    Par défaut
    Désolé
    Tu as raison, c'est le if + contains qui ne marche pas.

  8. #8
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    J'arrive peut etre un peu tard, mais:

    pourquoi ne pas utiliser la fonction scan?

    dans une étape data:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    %let predil="";/*vide par défaut*/
     
    if scan(nom,"dil")>0 /*nom contient le chaine de caractère dil, quelque part dans sa valeur*/
       then call symput ("predil",valeur);

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/01/2009, 19h59
  2. Variable utilisée dans une chaine de caractères
    Par cchampion2fr dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/10/2008, 14h46
  3. Interprèter variable pas comme une chaine de caractères
    Par Ze Big Duck dans le forum Langage
    Réponses: 4
    Dernier message: 11/11/2007, 12h20
  4. Réponses: 2
    Dernier message: 02/10/2007, 12h42
  5. Réponses: 2
    Dernier message: 20/07/2007, 17h17

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