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 :

Manipulation chaine caractère: identifier variable comportant autre chose que chiffres ou un point (prxmatch) [DATA]


Sujet :

SAS Base

  1. #1
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut Manipulation chaine caractère: identifier variable comportant autre chose que chiffres ou un point (prxmatch)
    Bonjour,

    Je cherche à identifier pour une variable toutes les valeurs qui contiennent autre chose que des chiffres ou un point (donc les signes >, <, ; / etc)

    J'ai vu sur d'autres posts que l'on peut utiliser la fonction prxmatch et une expression régulière. Mais je n'y arrive pas ...

    Je pourrai utiliser la fonction index mais je n'ai pas envie de lister tous les caractères spéciaux.

    Avec prxmatch, dans un premier temps, j'ai essayé de trouver tous les caractères qui ne sont pas des chiffres (je ne me suis donc pas occupée du point).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    data matable;
    	set matable;
    	if prxmatch('/\^w/',mavar)^=0 then specar1=1;
    run;
    > w = une lettre (maj./min.), un chiffre ou "_"
    > avec le ^, je me dis que prxmatch retourne un chiffre supérieur à 0 si ma variable contient autre chose qu'une lettre (maj./min.), un chiffre ou "_"
    > mais ça ne marche pas, tous mes specar1 sont différents de 1

    ex: ma variable contient <1.2 => specar1=.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    data matable;
    	set matable;
    	if prxmatch('/\W/',mavar)^=0 then specar2=1;
    run;
    > W = un caractère autre qu'une lettre, un chiffre ou le "_"
    > je me dis que prxmatch retourne un chiffre supérieur à 0 si ma variable contient autre chose qu'une lettre (maj./min.), un chiffre ou "_"
    > mais ça ne marche pas, tous mes specar2 sont égaux à 1

    ex: ma variable contient 23 => specar2=1


    Est ce l'expression régulière qui n'est pas correcte ?
    Merci de votre aide.

  2. #2
    Membre éprouvé
    Avatar de steelspirit
    Homme Profil pro
    SAS discute
    Inscrit en
    Janvier 2008
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SAS discute
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 472
    Points : 916
    Points
    916
    Par défaut
    Bonjour debdev,

    C'est une bonne idée d'utiliser les exp régulières pour ce genre de chose.
    Je te propose le pattern suivant : /\d|\./ => Recherche la position d'un chiffre OU d'un . sinon retourne 0.

    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
     
    data test;
    	pattern='/\d|\./';
    	length mavar $50;
    	mavar="ABC";
    	RESULTAT=prxmatch(pattern,mavar);
    	output;
    	mavar=123;
    	RESULTAT=prxmatch(pattern,mavar);
    	output;
    	mavar="A123";
    	RESULTAT=prxmatch(pattern,mavar);
    	output;
    	mavar="A12.3";
    	RESULTAT=prxmatch(pattern,mavar);
    	output;
    	mavar="A.B";
    	RESULTAT=prxmatch(pattern,mavar);
    	output;
    	mavar="A<B";
    	RESULTAT=prxmatch(pattern,mavar);
    	output;
    run;
    ça retourne 0 quand il n'y pas de chiffres ou de .

    Steel

  3. #3
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Salut steelspirit !

    Merci de ton aide.

    J'ai testé ton programme.

    Quand la variable = A123, ça ne retourne pas 0 car il trouve des chiffres. Or je souhaiterai que ça me renvoie 0 car je veux repérer toutes les valeurs qui contiennent autre chose que des chiffres (j'accepte avec un point éventuellement pour les décimales).

    Idem pour A12.3: ça ne retourne pas 0 car il y a des chiffres et un point. Mais je voudrais que ça retourne 0 car il y a un caractère alphabétique.

    Je suis donc reparti sur ton expression régulière. Car dans mon premier message, je partais dans le sens inverse pour ma regexp, je disais ce que je ne voulais pas trouver. Là, j'ai mis ce que je veux trouver.

    J'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pattern='/\d+.d+|\d+/';
    pour dire que je veux des chiffres seuls ou bien des chiffres suivis d'un point suivis de chiffres. Mais ça ne marche pas non plus. Je n'arrive pas à lui faire comprendre que je ne veux QUE:
    - soit des chiffres seuls
    - soit des chiffres suivis d'un point suivis de chiffres

    Avec le code précédent, ça ne retourne pas 0 pour mavar=A123 alors que je dois détecter qu'il y a un caractère non chiffre.

    Merci.

  4. #4
    Membre éprouvé
    Avatar de steelspirit
    Homme Profil pro
    SAS discute
    Inscrit en
    Janvier 2008
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SAS discute
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 472
    Points : 916
    Points
    916
    Par défaut
    Citation Envoyé par debdev Voir le message
    Quand la variable = A123, ça ne retourne pas 0 car il trouve des chiffres. Or je souhaiterai que ça me renvoie 0 car je veux repérer toutes les valeurs qui contiennent autre chose que des chiffres (j'accepte avec un point éventuellement pour les décimales).

    Idem pour A12.3: ça ne retourne pas 0 car il y a des chiffres et un point. Mais je voudrais que ça retourne 0 car il y a un caractère alphabétique.
    Je comprend pas trop Tu veux repérer toutes les valeurs qui contiennent autre chose que des chiffres.
    Dans mon exemple, SI RESULTAT = 0 alors la valeur contient autre chose que des chiffres SI RESULTAT>0 alors valeur contient que des chiffres.

    et sinon un truc comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pattern='/[A-Z]|[a-z]/';
    Sinon tu as également les fonction ANYALPHA et ANYDIGIT.

    Steel

  5. #5
    Membre éprouvé
    Avatar de steelspirit
    Homme Profil pro
    SAS discute
    Inscrit en
    Janvier 2008
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SAS discute
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 472
    Points : 916
    Points
    916
    Par défaut
    Arf oui j'ai compris ce que tu veux dire ... ça me donne mal au crane ton truc

  6. #6
    Membre éprouvé
    Avatar de steelspirit
    Homme Profil pro
    SAS discute
    Inscrit en
    Janvier 2008
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SAS discute
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 472
    Points : 916
    Points
    916
    Par défaut
    OK essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pattern='/(\d|\.)*^([A-Z]|[a-z])/';
    retourne 0 quand y a QUE des chiffres ...

    EDIT : non ça ne marche pas pour 123AB ...

    avec ANYALPHA :

    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
     
    data test;
    length mavar $50;
    	mavar="ABC";
    	RESULTAT=ANYALPHA(mavar);
    	output;
    	mavar=123;
    	RESULTAT=ANYALPHA(mavar);
    	output;
    	mavar=12.3;
    	RESULTAT=ANYALPHA(mavar);
    	output;	mavar="A123";
    	RESULTAT=ANYALPHA(mavar);
    	output;
    	mavar="A12.3";
    	RESULTAT=ANYALPHA(mavar);
    	output;
    	mavar="A.B";
    	RESULTAT=ANYALPHA(mavar);
    	output;
    	mavar="A<B";
    	RESULTAT=ANYALPHA(mavar);
    	output;
    	mavar="123A<B";
    	RESULTAT=ANYALPHA(mavar);
    	output;
    run;
    RETOURNE 0 QUAND C'EST QUE DES CHIFFRES .... j'ai bon ???

  7. #7
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    data test;
     
    mavar=A123;
    onlynumeric = (compress(mavar , '0123456789','d')='' ) ;
    run;

  8. #8
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Bonjour,

    RETOURNE 0 QUAND C'EST QUE DES CHIFFRES .... j'ai bon ???
    @steelspirit: C'est exactement ça ! Merci beaucoup. Je ne connaissais pas cette fonction.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DATA test;
    mavar="A123";
    onlynumeric = (compress(mavar , '0123456789','d')='' ) ;
    run;
    @datametric: ton code fonctionne bien pour détecter que des chiffres et retourne 1 dans ce cas. Mais j'accepte les points (pour les décimales): or dans ce cas, si mavar="1.23", ça me retourne 0 alors que je souhaiterai 1.


    Merci à tous les 2 pour votre aide.
    Bonne journée !

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    il manque un truc encore a ton algo,

    en effet si tu dois décider que c'est bien un chiffre alors tu dois ajouter :

    le fait d'avoir un signe négatif (-)
    le fait d'avoir une puissance (E)
    le fait de ne pas avoir deux points (.)

    quelque chose comme cela...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    %put %datatyp(10);
    %put %datatyp(-10); 
    %put %datatyp(-10.);
    %put %datatyp(-100.2);
    %put %datatyp(.-10);
    %put %datatyp(.-10.1); 
    %put %datatyp(-10.1.2);
    %put %datatyp(-10.1E2);
    %put %datatyp(101E-2);
    x

  10. #10
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    Dans ce cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DATA test;
    mavar="A123";
    onlynumeric = (compress(mavar , '0123456789.','d')='' ) ;
    run;

  11. #11
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Bonjour,

    @xav2229, tu as raison, je n'avais pas pensé à ces différentes possibilités. Dans mon cas, la méthode évoquée plus haut fonctionne car je n'ai pas ces cas particuliers (exposant, 2 points, ...), j'ai pu le vérifier "à la main". Mais merci de m'avoir indiqué ces cas à prendre en compte.

    @datametric, c'est nickel aussi. j'ai lu sur le web que ce 3ème argument de la fonction compress est arrivé avec la v9. Je ne connaissais pas, merci de me le faire découvrir.

    Bonne journée.

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

Discussions similaires

  1. [XL-2003] Manipulation chaine caractères et insertion formule
    Par Methodrone8 dans le forum Excel
    Réponses: 3
    Dernier message: 15/05/2013, 11h55
  2. Réponses: 6
    Dernier message: 15/06/2011, 13h10
  3. Variable alphanumérique contient autre chose que
    Par yahnou dans le forum SAS Base
    Réponses: 4
    Dernier message: 24/04/2009, 20h15
  4. Arrive plus a installer autre chose que debian
    Par kosmic dans le forum Debian
    Réponses: 10
    Dernier message: 12/12/2005, 12h50
  5. [langage] connaissez-vous autre chose que -d
    Par Sébastien dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2002, 21h13

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