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 :

Extraction de plusieurs mots dans une chaine de caractère


Sujet :

SAS Base

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Février 2014
    Messages : 39
    Points : 54
    Points
    54
    Par défaut Extraction de plusieurs mots dans une chaine de caractère
    Bonjour à vous,

    J'ai une variable dans laquelle j'ai :

    VAR0 = EGTESTCD EQ "AVCOND" AND EGCAT EQ "FINDING"

    Et je voudrais obtenir ceci :

    VAR1 VAR2
    EGTESTCD AVCOND
    EGCAT FINDING

    Pour le moment j'ai réussi à obtenir la VAR2 avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    data tab2;
    	set tab1;
    	length  VAR2 $200;
     
    	i=2;
    	do while (scan(VAR0,i,"""") ne "");
    		VAR2=scan(VAR0,i,"""");
    		i=i+2;
    	output;
    	end;
    run;
    Mais pour obtenir la VAR1 avec la VAR2 je ne trouve pas de solution qui fonctionne...

    Si quelqu'un a une idée ?

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

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

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

    les bons outils pour faire ce genre de choses sont les expressions rationnelles (REGULAR EXPRESSION).

    Voici un code qui marche sur ton 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
    DATA Table1 ;
    VAR0 = 'EGTESTCD EQ "AVCOND" AND EGCAT EQ "FINDING"';
    RUN;
     
    DATA Table2;
    SET Table1;
    LENGTH VAR1 VAR2 $50. ;
    RETAIN REGEX;
    DROP VAR0 REGEX;
    IF _N_ =1 THEN 	DO;
    		REGEX=PRXPARSE('/^(.*)\sEQ\s"(.*)"\sAND\s(.*)\sEQ\s"(.*)"/');
    				END;
    IF PRXMATCH(REGEX,VAR0) THEN 	DO;
    							VAR1=PRXPOSN(REGEX,1,VAR0);
    							VAR2=PRXPOSN(REGEX,2,VAR0);
    							OUTPUT;
    							VAR1=PRXPOSN(REGEX,3,VAR0);
    							VAR2=PRXPOSN(REGEX,4,VAR0);
    							OUTPUT;
    								END;
    RUN;
    PROC PRINT DATA=Table2;RUN;
    Obs VAR1 VAR2

    1 EGTESTCD AVCOND
    2 EGCAT FINDING

    après si cela ne te suffit pas il faudra préciser ta demande.

    Cordialement.

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Février 2014
    Messages : 39
    Points : 54
    Points
    54
    Par défaut Précision
    En fait, dans la VAR0 j'ai oublié de préciser qu'il y a plusieurs possibilité
    VAR0 peut etre égale a plusieurs cas de figures :

    EGTESTCD EQ "AVCOND" AND EGCAT EQ "FINDING"
    TSPARMCD EQ "SPONSOR"
    EGTESTCD EQ "HRMED" AND EGCAT EQ "MEASUREMENT"
    LBTESTCD EQ "CK" AND LBCAT EQ "CLINICAL CHEMISTRY" AND LBSPEC EQ "SERUM"

    Je ne pense pas que ca puisse dépasser 3 égalités.

    En tout cas merci pour cette réponse, je ne connaissais pas ! C'est vraiment super de pouvoir apprendre plein de choses à travers vos réponses !

  4. #4
    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
    38
    39
    40
    41
    42
    43
    44
     
    data tab1;
    input var0 $70.;
    cards;
    A EQ "CK" AND LBCAT EQ "CLINICAL CHEMISTRY" AND LBSPEC EQ "SERUM"
    EGTESTCD EQ "HRMED" AND EGCAT EQ "MEASUREMENT"
    EGTESTCD EQ "AVCOND" AND EGCAT EQ "FINDING"
    EGTESTCD EQ "AVCOND"
    EGCAT EQ "FINDING"
    A EQ "B" AND C EQ "C"
    ;run;
     
     
    data tab2;
    	set tab1;
    	length  VAR1 $200;
     
    	i=1;
    	do while (scan(VAR0,i,"""") ne "");
    		VAR1=scan(VAR0,i,"""");
    		i=i+2;
    		output;
    		end;
        drop i;
    run;
     
    data tab3;
    	set tab1;
    	length  VAR2 $200;
     
    	i=2;
    	do while (scan(VAR0,i,"""") ne "");
    		VAR2=scan(VAR0,i,"""");
    		i=i+2;
    		output;
    		end;
        drop i;
    run;
     
    data fin;
    merge tab2 tab3;
    var1=compress(tranwrd(var1,"EQ",""));
    var1=compress(tranwrd(var1,"AND",""));
    run;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Février 2014
    Messages : 39
    Points : 54
    Points
    54
    Par défaut
    Bonjour,

    Merci pour cette nouvelle solution !

    J'avais essayé avec ce type de code et je ne faisais pas les COMPRESS() au moment ou il fallait et je n'avais pas pensé à faire une jointure.

    Cordialement

  6. #6
    Membre expérimenté
    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
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour,
    C'est une solution avec call scan :
    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 test;
    VAR0 ='EGTESTCD EQ "AVCOND" AND EGCAT EQ "FINDING"';
    VAR0 =compress(VAR0, '"') ;
    do i = 1 by 1 ;
           call scan(VAR0, i,    pos, len) ;
    	   call scan(VAR0, i+1, pos1, len1) ;
           if pos = 0 then leave ;
    	   LP=lag(pos) ; LL=lag(len) ;	
           if substr(VAR0, pos, len) = "EQ" then do; 
            VAR1=substr(VAR0, LP, LL) ;    
    		VAR2=substr(VAR0, POS1, LEN1) ;   
    		output ;
           end ; 
           end;									 
    Keep Var0 Var1 Var2 ;
    run;
    Cdt Ward

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. Recherche de plusieurs mots dans une chaine
    Par Thib6670 dans le forum C#
    Réponses: 3
    Dernier message: 30/06/2011, 15h19
  3. Extraction mots dans une chaine de caractère
    Par mercure07 dans le forum C
    Réponses: 6
    Dernier message: 30/07/2008, 13h54
  4. [RegEx] trouver un mot dans une chaine de caractère
    Par starr dans le forum Langage
    Réponses: 2
    Dernier message: 22/06/2007, 15h36
  5. recherche de mots dans une chaine de caractères
    Par jeanfrancois dans le forum Langage
    Réponses: 5
    Dernier message: 10/02/2006, 10h47

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