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 :

Création de X variables à partir de position dans une chaîne de caractère


Sujet :

SAS Base

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 97
    Points : 64
    Points
    64
    Par défaut Création de X variables à partir de position dans une chaîne de caractère
    Bonjour,

    J'ai une table avec une seule variable en format caractère. Une correspondance me donne la position des variables qui m'intéressent dans cette chaîne.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    data t1;
    	input var: $100.;
    	cards;
    20150102001MarcM019
    20150109001GaelF031
    	;
    run;
    Les 8 premiers caractères me donnent la date, les 3 suivants le nombre de personnes présentes à la réunion, les 4 suivants les premières lettres du prénom, le suivant le sexe et les 3 suivants l'âge. Je peux donc récupérer facilement les informations :

    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
    data t2;
    	set t1;
    	format reuniondate ddmmyy10.; 
    	reuniondate=mdy(substr(var, 5, 2), substr(var, 7, 2), substr(var, 1, 4));
     
    	format reunionnb 3.;
    	reunionnb=substr(var, 9, 3);
     
    	prenom=substr(var, 12, 4);
     
    	sexe=substr(var, 16, 1);
     
    	format age 3.;
    	age=substr(var, 17, 3);
    run;
    Par contre certaines données peuvent être répétées dans cette chaîne donc toutes les informations suivantes sont forcément "décalées" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    data t1;
    	input var: $100.;
    	cards;
    20150102001MarcM019
    20150109001GaelF031
    20150116002MarcPaulMM019082
    20150123003MarcPaulGaelMMF019082031
    	;
    run;
    Pour le 3e enregistrement, la valeur retrouvée nbreunion m'indique qu'il y a désormais 2 personnes : compte tenu de ce paramètre je peux identifier sans problème la position des informations qui m'intéressent dans la suite de la chaîne. J'ai essayé d'utiliser une boucle do/end pour pouvoir créer un certain nombre de variables (par exemple prenom1 à prenomX où X est la valeur identifiée en récupérant ma valeur reunionnb), mais j'ai deux soucis :
    - Je n'arrive pas à utiliser la valeur d'une variable dans ma boucle
    - Je n'arrive pas à utilise mon paramètre "i" allant de 1 à X dans la boucle

    Voici mon exemple qui ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    data t2;
    	set t1;
    	format reuniondate ddmmyy10.; 
    	format reunionnb 3.;
    	reunionnb=substr(var, 9, 3);
     
    	do i=1 to reunionnb;
    		format prenom_i $4.;
    		format age_i 3.;
    		format sexe_i $1.;
    		end;
    run;
    J'utilise peu les boucles et je ne suis pas très à l'aise avec ces codes (je ne sais pas trop s'il faut utiliser &i ou i dans la boucle... mais ni l'un ni l'autre ne fonctionne) J'ai aussi tenté de faire la boucle avec une macro (les quelques boucles que j'ai utilisées il me semblait que ça marchait en macro mais pas forcément dans une étape data...).

    A partir du moment où je saurais utiliser mon "i" et mon "reunionnb" à l'intérieur de la boucle je pourrais récupérer toutes les informations qui m'intéressent. Je suppose que la réponse est simple mais pour l'instant je suis bloqué...

    Suis-je parti dans la bonne voie ? Savez-vous comment je peux m'en sortir facilement avec ce bout de code dans une boucle do/end ?

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Points : 1 142
    Points
    1 142
    Par défaut
    Bonjour,

    Tu peux utiliser des Array, après avoir au préalable déterminé le nombre de participants max
    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
    data _null_;
    set t1 end=fin;
    retain reunionnbmax 0;
    reunionnbmax = max(reunionnbmax,input(substr(var, 9, 3),3.));
    if fin then call symput('reunionnbmax',reunionnbmax);
    run;
     
    data t2 (drop=i);
    set t1;
    format reuniondate ddmmyy10.; 
    format reunionnb 3.;
    array prenom_(&reunionnbmax) $;
    array sexe_(&reunionnbmax) $;
    array age_(&reunionnbmax) ;
    reuniondate=mdy(substr(var, 5, 2), substr(var, 7, 2), substr(var, 1, 4));
    reunionnb=substr(var, 9, 3);
    do i=1 to reunionnb;
    	prenom_(i) = substr(var, i*4+8, 4);
    	sexe_(i) = substr(var, ((reunionnb*4)+11)+i, 1);
    	age_(i) = substr(var, ((reunionnb*4)+reunionnb+11)+i*3-2, 3);
    	end;
    run;
    Bon courage !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 97
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par edward carnby Voir le message
    Bonjour,

    Tu peux utiliser des Array, après avoir au préalable déterminé le nombre de participants max
    C'est impeccable, merci beaucoup ! Je ne comprends pas toutes les lignes de codes mais j'ai réussi à l'appliquer à mon problème. Pour mon application, il faut que mes variables répétées (ici les prénoms et noms sur une longueur courte) puissent être plus longues (sur 80 digits). Après tentative j'ai vu que l'on pouvait appliquer un format plus précis dans l'attribution du array :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array prenom_(&reunionnbmax) $80;
    Encore merci !

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

Discussions similaires

  1. Position d'une chaîne de caractères dans un fichier
    Par laloupiote dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 07/01/2012, 11h26
  2. Réponses: 4
    Dernier message: 06/07/2011, 09h35
  3. [AC-2007] Determiner une position dans une chaîne
    Par fleurparis dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 17/12/2009, 14h44
  4. Réponses: 4
    Dernier message: 16/12/2009, 14h39
  5. Réponses: 2
    Dernier message: 19/04/2007, 15h26

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