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 :

Mettre plus d'une expression dans la TRANWRD


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Points : 13
    Points
    13
    Par défaut Mettre plus d'une expression dans la TRANWRD
    Bonjour,

    J'ai beaucoup de mots (modalités) contenues dans la variable code qui doivent être remplacés par une chaîne vide (blanc), ensuite compresser ce blanc.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    code=compress(tranwrd(code,"3-Forthepurposesofsubheading480511,“semi-chem","")); 
    code=compress(tranwrd(code,"3-Headings",""));  
    code=compress(tranwrd(code,"3-TheprovisionsofNotes3and4toSectionXVIapp","")); 
    code=compress(tranwrd(code,"300",""));
    code=compress(tranwrd(code,"4-","")); 
    code=compress(tranwrd(code,"4-(A)",""));
    Il doit y avoir 300 expressions ainsi ou je dois les remplacer à chaque fois par la chaîne vide.

    Ce que je veux :
    avoir une solution ou la tranwrd peut contenir plusieurs expressions (et non une seule comme ce que j'ai marqué ci-dessus) qu'on pourrait remplacer par la chaîne vide. Celà m'aidera à réduire les lignes de code.

    D'avance merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingénieur Pilotage
    Inscrit en
    Avril 2009
    Messages
    405
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur Pilotage
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 405
    Points : 1 063
    Points
    1 063
    Par défaut
    Ca dépend où se situe les 300 expressions à incorporer dans la formule.
    Ce que je ferais :

    - 1- récupérer ces expressions en une macro variable
    - 2- compter le nombre d'expressions
    - 3- faire une boucle avec la formule citée et SCAN

    Après ca dépend où vous récupérez "ces expressions" (car par exemple, on pourrait créer autant de variables autant qu'il y a d'expressions).

    Cdt
    I always thought that the person who specialized in using just SAS PROCS should
    be known as the SAS Proctologist.

  3. #3
    Membre régulier
    Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Septembre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Septembre 2013
    Messages : 27
    Points : 76
    Points
    76
    Par défaut
    Bonsoir,

    Via un into & un scan tu peux faire comme l'exemple ci-dessous :

    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
    /**** Table avec la liste des expressions ***/
    data t1;
    	format trann $30.;
    	set sashelp.cars;
    	trann=upcase(model);
    run;
     
    /*** Recupération de toutes les expressions dans une variables ***/
    %let nbvar= ;%let var="";
    proc sql noprint;
    	select count(distinct trann) into : nbvar  from t1;		   /* nbvar => Nombre de variable différente */
    	select distinct trann into : var separated by "|" from t1; /* var => Toutes les expressions dans une variable */
    run;quit;
    %put nbvar : &nbvar.;
    %put var : &var.;
     
    %macro tranwrd1();
    	data t2;set t1;
    		%do i=1 %to &nbvar.;	/* A chaque ligne je regarde toute les expressions */ 
    			%let word=%scan("&var.",&i.,"|");	
    			if index(upcase(MODEL),"&word.") ne 0 then do;	/* Si l'expression est trouvée alors */
    				model=tranwrd(upcase(model),"&word.","__");	/* je la remplace par ___ */
    			end;
    		%end;
    	run;
    %mend tranwrd1;
    %tranwrd1();
    Avec cette solution tu peux rencontrer plusieurs problèmes :
    -La variable var à une limite de nombre de caractère
    -bien choisir le delimiter ici |
    -l'ordre de remplacement
    ex : caribou -> Tu remplaces rib par . -> Tu remplaces car par .
    caribou -> ca.ou -> ca.ou

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Points : 13
    Points
    13
    Par défaut merci lelensois16 mais....possibilité bien sur d'interventiuon par toute la communauté du Forum
    merci lelensois16 pour la rapidité de ta réponse

    Cependant, je ne connais rien dans le macro langage (raison pour laquelle j'ai posté la question)

    pour répondre à ta question, supposons que les modalités qui figurent dans la variable code et que je voudrais remplacer par une chaine vide sont au nombre de 6, et sont celles que j'ai déjà énoncé dans mon exemple dans le premier post.

    à savoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    code=compress(tranwrd(code,"3-Forthepurposesofsubheading480511,“semi-chem","")); 
    code=compress(tranwrd(code,"3-Headings","")); 
    code=compress(tranwrd(code,"3-TheprovisionsofNotes3and4toSectionXVIapp","")); 
    code=compress(tranwrd(code,"300",""));
    code=compress(tranwrd(code,"4-","")); 
    code=compress(tranwrd(code,"4-(A)",""));
    Pourrais-tu m'écrire le code correspondant à la macro dont tu parlais?

    Toute autre solution est la bienvenue

  5. #5
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    Hello,
    Si tu connais toutes tes valeurs à remplacer, Il suffit de créer une table valeurs à remplacer et applique par la CALL EXECUTE, Exemple :

    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
     
     
    /* La table valeurs contient les valeurs à remplacer */
    data valeurs;
    input var : $47.;
    cards;
    3-Forthepurposesofsubheading480511,“semi-chem 
    3-Headings 
    3-TheprovisionsofNotes3and4toSectionXVIapp 
    300
    4- 
    4-(A)
    ;
    run;
     
    /* Table à traiter*/
    data exemple;
    input origine : $60.;
    cards;
    zer3-Forthepurposesofsubheading480511,“semi-chemtytuyu 
    333-Headingstytuui 
    tytt3-TheprovisionsofNotes3and4toSectionXVIappretyty 
    345300rte5ç
    345RT4-é"'dfd 
    h_tf4-(A)é"ez"
    ;
    run;
     
    /* Résultat */
    data _null_;
    set valeurs ;
    	call execute ("data exemple; set exemple; " !!
        " if index (origine,"!! quote(strip(var))!!" )>=1 then cible=tranwrd(origine,"!! quote(strip(var))!!",''); "!!
    	"run;");
     
    run;
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/11/2012, 15h25
  2. Réponses: 2
    Dernier message: 25/05/2009, 09h26
  3. Réponses: 8
    Dernier message: 01/03/2007, 08h44
  4. [ImageMagick] Comment mettre plus qu'un graphique dans une page ?
    Par 12_darte_12 dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 29/06/2006, 20h30
  5. [Etat-Transition] Peut on montrer plus d'une classe dans un diagramme d'état-transition ?
    Par thebloodyman dans le forum Autres Diagrammes
    Réponses: 5
    Dernier message: 12/01/2006, 13h56

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