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 :

Sortir d'une boucle DO WHILE [DATA]


Sujet :

SAS Base

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut Sortir d'une boucle DO WHILE
    Bonjour,

    J'ai un table avec une colonne A. Je voudrais, pour chaque ligne de cette table, vérifier si la valeur de la colonne A contient au moins un mot d'une liste de valeurs que j'ai en macro-variable.

    J'ai un code qui ressemble à ceci :

    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
     
    %macro test
     
    data table_entree;
     
    	%let i =1;
     
    	%do %while(&i< &nb_macro) /* &nb_macro = le nombre de macro variables */
     
    		if index(a, "&&macrovariable_&i.")> 0 then flag = 1;
     
    		%let i = %eval(&i+1);
     
    	%end;
     
    run;
     
     
    %mend;
    J'aimerais sortir de la boucle dès que le flag vaut 1, et non attendre qu'elle scanne toutes les valeurs des macro-variables s'il a déjà trouvé une correspondance.

    Auriez-vous une idée de comment faire ? J'ai essayé d'initialiser une macro-variable si le flag est à 1, puis d'ajouter cette macro-variable dans la boucle while, mais ça ne marche pas, la macro variable n'est initialisée qu'à la sortie de la boucle il me semble.

    Merci d'avance.

  2. #2
    Membre chevronné
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Par défaut
    Tu es très mal parti car le langage macro et le code SAS sont asynchrones. Le premier est interprété avant le second. Tu ne pourras pas faire dépendre ton code macro de tes données SAS. Et même en imaginant que tu y arrives, ce serait du mauvais code.

    Je suppose que tu as "call symputé" les &&macrovariable_&i. et qu'il y en a beaucoup. Ce n'est pas bon non plus.

    Transforme tes données SAS de valeur &&macrovariable_&i. en informat ou si elles sont trop nombreuses passe par du hashage ou tout simplement une jointure.

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    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 : 483
    Par défaut
    C'est très simple à faire regarde l'exemple suivant puis essaye de construire un code qui correspond à ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    %let macrovariable= 1 5 8 2 ;
    DATA table_entree;
    input A ;
    if A in (&macrovariable) then do ; flag = 1;                           
    stop 
    end ;
    cards ;
    6
    9
    1
    7
    8
    ;

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    Merci de vos réponses. Effectivement j'ai mis en call symput mes variables.
    La difficulté est que je ne peux pas passer par une table de hash car en fait je ne cherche pas une égalité entre la valeur A et la macro variable mais plutôt le fait que la valeur de la macro variable se retrouve en partie dans A :

    A like '%&macrovariable%' . Et une jointure like consomme énormément de temps.

    Désolé si je n'ai pas été clair.

  5. #5
    Membre Expert
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Par défaut
    Bonjour,

    "je ne peux pas passer par une table de hash car en fait je ne cherche pas une égalité"

    oui sauf qu'ici

    IF A IN (&macrovariable)c'est bien une égalité qui est cherchée et ici pour cette partie de ton code le Hash est tout indiqué.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    J'ai édité mon message initial pour plus de clarté.

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

Discussions similaires

  1. [AC-2000] Sortir d'une boucle while wend
    Par 973thom dans le forum VBA Access
    Réponses: 2
    Dernier message: 03/09/2009, 10h14
  2. Sortir d'une boucle while
    Par dahu007 dans le forum Langage
    Réponses: 14
    Dernier message: 15/06/2008, 17h33
  3. comment sortir d'une boucle while d'un Iterator
    Par solawe dans le forum Langage
    Réponses: 6
    Dernier message: 18/03/2008, 13h46
  4. Sortir d'une boucle while
    Par chris81 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 21/01/2008, 11h50
  5. Probleme pour sortir d'une boucle while
    Par aikinhdo dans le forum Langage
    Réponses: 0
    Dernier message: 27/07/2007, 15h01

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