Discussion: Inversion de lettres

  1. #1
    Membre du Club
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    décembre 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2014
    Messages : 65
    Points : 59
    Points
    59

    Par défaut Inversion de lettres

    Bonjour,
    peut-on détecter une inversion de lettre entre deux chaines de caractères ?
    exemple:

    var1=DUPNOT var2=DUPONT

    Ici j'ai une inversion d'une lettre : le N (je me base toujours sur ma première variable var1)
    si une lettre inversé je put NB=1
    si plus d'une lettre je put NB=10


    Merci

  2. #2
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    juillet 2011
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : juillet 2011
    Messages : 352
    Points : 920
    Points
    920
    Billets dans le blog
    9

    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
    data test;
     input var1 $ var2 $;
     
    datalines;
    dupont duopnt
    dupond duonpd
    dupond1 dupond1
    ; run;
     
    data test1;
    set test;
    length diff $10.;
    retain diff;
    diff="";
    do i=1 to length(var1);
    diff=char(var1,i);
    diff1=char(var2,i);
    ver=verify(diff,diff1);
    if ver=1 then 
    output;
    end ;
    run;
    proc sort data=test1; by var1; run;
     
    data test2;
    set test1;
    by var1;
    if first.var1 then do nb=0 ;end;
    nb+1;
    if last.var1 then output;
    run;
    proc sort data=test; by var1;
     
    data test2 (keep=var1 var2 nb);
    merge test test2;
    by var1;
    if nb=. then nb=0;
    if nb=2 then nb=1; 
    if nb>2 then nb=10;
    run;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  3. #3
    Membre du Club
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    décembre 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2014
    Messages : 65
    Points : 59
    Points
    59

    Par défaut

    Merci pour cette réponse rapide.
    C'est exactement ce que je veux.
    J'ai une seconde problématique

    je cherche aussi a sortir le nombre de lettre : en plus présente dans var1 par rapport a var2
    :et les lettres en moins dans var1 par rapport a var2
    avec le code ci-dessous j'obtiens ce que je veux mais uniquement si la lettre en plus dans var1 est absente dans var2.
    ex1:
    var1=DUPONTZZ var2=DUPONT NB=2 (résultat OK)

    ex2:
    DUPONTOO var2=DUPONT NB=0 (puisque le O existe dans var2 il me sort NB=0) (résultat KO)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if lengthn(compress(upcase(var1)))> lengthn(compress(upcase(var2))) then nb=lengthn(upcase(compress(upcase(var1), upcase(var2))));
    if lengthn(compress(upcase(var1)))< lengthn(compress(upcase(var2))) then nb=lengthn(upcase(compress(upcase(var2), upcase(var1))));


    Merci

  4. #4
    Membre du Club
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    décembre 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2014
    Messages : 65
    Points : 59
    Points
    59

    Par défaut

    Je reviens sur ta réponse Brahim.

    mon vrai besoin c'est de faire le traitement non pas sur que var1 et var2 mais sur var1/var2 et var3/var4 et var5/var6 et var7/var8 avec le même principe.

    Peux t-on l'adapter ? j'ai essayé de mon coté et malheureusement je m'en sort pas.


    Merci pour ton aide

  5. #5
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    juillet 2011
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : juillet 2011
    Messages : 352
    Points : 920
    Points
    920
    Billets dans le blog
    9

    Par défaut

    Bonjour,

    je cherche aussi a sortir le nombre de lettre : en plus présente dans var1 par rapport a var2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    data test;
     input var1 $12. var2 $;
     datalines;
     dupontoont duopnt
    ; run;
    data test3;
    set test;
    if lengthn(compress(upcase(var1)))> lengthn(compress(upcase(var2))) then nb=lengthn(substr(var1,lengthn(var2)+1));
    run;
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  6. #6
    Membre du Club
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    décembre 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2014
    Messages : 65
    Points : 59
    Points
    59

    Par défaut

    Merci Brahim pour ta réponse.

    ta solution est valable uniquement dans le cas ou var2 est dans var1.

    si par exemple j'ai:

    var1=zedupotgre var2=dupont

    Dupont dans var1 est tronqué il manque le 'N', mais ce n'est pas une problématique dans mon besoin.

    en gros il faut lire les lettres de var2 présente dans var1 et sortir les lettres en plus , ici je sort le z,e,g,r,e ==>NB=5



  7. #7
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    juillet 2011
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : juillet 2011
    Messages : 352
    Points : 920
    Points
    920
    Billets dans le blog
    9

    Par défaut

    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
    data test;
    input var1 :$20. var2 :$10.;
    datalines;
    dupodfzntG duopnt
    dupond duonpdcr
    dupond1 dupond1
    zedupotgre dupont
    ; run;
    proc sort data =test;by var1 var2;run;
    data test1 (keep=var1 var2 dif nb);
    set test;
    by var1;
    length diff1 $20.;
    retain diff1;
    diff1="";
     
    length diff21 $20.;
    retain diff21;
    diff21="";
    do i=1 to length(var1);
    diff=char(var1,i);
    ver=verify(diff,var2);
    if ver=1 then diff1=catx('',diff1,diff);
     
    end;
     
    do i=1 to length(var2);
    diff2=char(var2,i);
    ver2=verify(diff2,var1);
    if ver2=1 then diff21=catx('',diff21,diff2);
    end;
    dif=compress(diff1!!diff2);
    nb=length(dif);
    run;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  8. #8
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    mai 2011
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

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

    Informations forums :
    Inscription : mai 2011
    Messages : 652
    Points : 1 523
    Points
    1 523

    Par défaut

    Bonsoir,

    dans ta question tu as deux aspects :

    La compraison de chaîne de caractères, et là tu as quelque outils dans SAS qui te permettrons d'avoir une première approche , par exemple les fonction COMPLEV , COMPGED , SPEDIS , SOUNDEX et consorts http://blogs.sas.com/content/sgf/201...sas-functions/

    Tu auras aussi le loisir de trouver la description d'autres algorithmes sur le net :

    https://en.wikipedia.org/wiki/Cosine_similarity

    https://en.wikipedia.org/wiki/Jaccard_index

    https://en.wikipedia.org/wiki/Jaro%E...nkler_distance


    si tu as des échantillons d'apprentissage tu peux t'essayer à des choses plus fûtées

    http://www.cs.utexas.edu/~ml/papers/...roposal-03.pdf

    Quand à ta dernière question tu peux essayer ce code

    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
     
    DATA A;
    length var1 var2 $100 ;
     
    var2="zedupotgre"; var1="dupont";
    output;
     
    var1="dupont";
    var2="duconlajoie";
    output;
    var1="laroche";
    var2="laclochelajoie";
    output;
    run;
     
    DATA B;SET A;
    res=compress(var2,var1);
    nb=length(res)
    run;
    proc print data=b;run;
    Obs.
    var1 var2 res
    1 dupont zedupotgre zegre
    2 dupont duconlajoie clajie
    3 laroche laclochelajoie ji


    Après si tu as une volumétrie plutôt costaud il vaut mieux t'orienter vers du code adhoc tel que proposé par m.brahim que vers des fonctions SAS existantes aux applications douteuses sur de larges volumétries.

    Cordialement

  9. #9
    Membre du Club
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    décembre 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2014
    Messages : 65
    Points : 59
    Points
    59

    Par défaut

    Merci pour vos réponses, mais le résultat ne correspond pas à mes attentes.

    Je vais essayer de simplifier ma demande.

    je cherche a sortir les lettres qui sont présentes dans var1 et non dans var2 même si elles sont pas dans l'ordre et même si elle se répètent.
    je cherche a sortir les lettres qui sont absentes dans var1 et présentes dans var2 même si elles sont pas dans l'ordreet même si elle se répètent.

    lettre en plus:
    var1=oodupont var2=dupont ici les deux oo qui sont en plus je l'ai compte 2 fois (NB=oo)
    var1=duzpont var2=dupont (NB=z)
    var1=dutonp var2=dupont (NB=.)

    lettre en moins:
    var1=zdupo var2=dupont (NB=nt)
    var1=duton var2=dupont (NB=p)


    merci a vous je galère

  10. #10
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    mai 2011
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

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

    Informations forums :
    Inscription : mai 2011
    Messages : 652
    Points : 1 523
    Points
    1 523

    Par défaut

    Bonjour,

    en fait ce que tu est en train de chercher c'est un algorithme qui réponde à ton besoin qui est encore en cours d'explicitation.
    Tu ne trouveras rien de tout prêt et mâché en terme de fonction dans sas.

    Tu nous explique ce que tu veux avec des cas particuliers...mais pour quelque chose qui n'existe pas c'est un algorithme qu'il te faut décrire.

    Cherche l'algorithme ou explicite le et tu auras un code, ou du moins on pourra à partir de ce moment t'y aider à l'écrire.

    Mais ce n'est pas ici un forum d'algorithmie et je ne pense pas que tu trouveras ici la réponse à ta question.

    Sans s'y limiter exactement, ton algorithme s'apparente à des problèmes d'alignement de séquence.

    Par exemple tu pourra peut-être trouver des choses ici

    https://en.wikipedia.org/wiki/Smith%...rman_algorithm

    un peu de littérature ici

    https://ocw.mit.edu/courses/electric...re5_newest.pdf

  11. #11
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    janvier 2013
    Messages
    395
    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 : 395
    Points : 1 362
    Points
    1 362

    Par défaut

    Bonjour,
    Le code suivant permet d’extraire les LETTRES EN PLUS sur l’exemple donné. C’est avec la base qu’il faudrait vérifier en espérant que ça correspondrait bien à tes attentes.
    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 A;
    length var1 var2 $100 ;
    var1="dupont" ; var2="oozedupotgre"   ; output;
    var1="dupont" ; var2="duconlajoie"    ; output;
    var1="laroche"; var2="laclochelajoie" ; output;
    var1="dutonp" ; var2="dupont"         ; output;
    run;  
     
    data AA(keep=var1 var2 Lettres_En_Plus Nbrltrs_En_Plus);
    set A ;	 
    length concat cntc $100 ;
    cnt=0 ;
    res=compress(var2, var1);
    nb=lengthn(res);	
    do i=1 to lengthn(var1) ;
    cntc=countc(var2, char(var1, i)) ;	   
    if cntc > 1 then do ; concat=cats(concat, char(var1, i)) ;  cnt+cntc-1 ; end ;
    end; 
    Lettres_En_Plus=cats(concat, res) ;
    Nbrltrs_En_Plus=nb+cnt ; 
    run;
    Bon Courage
    Ward

  12. #12
    Membre du Club
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    décembre 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2014
    Messages : 65
    Points : 59
    Points
    59

    Par défaut

    Bonjour,
    Merci Ward.
    Je viens de tester la fonction complev et apparemment j'obtiens ce que je veux.
    je suis en phase de teste je vous tiens au courant.

  13. #13
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    juillet 2011
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : juillet 2011
    Messages : 352
    Points : 920
    Points
    920
    Billets dans le blog
    9

    Par défaut

    Bonjour,

    J'ai cette solution à te proposer:


    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    /*premier traitement*/
     
    data fin;
    input var1  $50. var2  $50. nbtotal;
    cards;
    run;
     
    DATA init;
    length var1  var2 $50. ;
    var1="duzpont"; var2="dupont" ; output;
    var1="oodupont"; var2="dupont";output;
    var1="dutonp"; var2="dupont";output;
    var1="zdupo"; var2="dupont" ;output;
    var1="duton" ;var2="dupont";output;
    run;  
     
    %macro test(var1,var2);
     
    data test;
    set init(where=(var1="&var1" and var2="&var2"));
    run;
     
    data test1 ;
    set test;
    length diff1 $20.;
    retain diff1;
    diff1=""; 
    length diff21 $20.;
    retain diff21;
    diff21="";
    if length(var1)>=length(var2)then do;
    do i=1 to length(var1);
    diff=char(var1,i);
    ver=verify(diff,var2);
    if ver=1 then diff1=catx('',diff1,diff);
    end;
    end;
    if length(var1)<length(var2)then do;
    do i=1 to length(var2);
    diff2=char(var2,i);
    ver2=verify(diff2,var1);
    if ver2=1 then diff21=catx('',diff21,diff2);
    end;
    end;
    dif=compress(diff1!!diff21);
    if dif="" then nb=0; else nb=length(dif);
     
    run;
     
     
     
     
    /*deuxième traitement meme lettre*/
     
    data test2(drop=dif);
    set test1;
    var1=compress(var1,dif);
    var2=compress(var2,dif);
    run;
     
    proc sql noprint;
    select max(max(length(var1)),max(length(var2))) into:nbr from test;
    quit;
    %put  "NBR=" &nbr;
    data test3(drop=i);
    set test2;
    do i=1 to &nbr.;
     x1=char(var1,i);
       x2=char(var2,i);
       if compress(x1)="" and compress(x2)="" then delete;
      output;
     end; 
    run;
     
    proc sql;
    create table test4 as select x1 , count (x1) as nb1 from test3 where x1 ne ""
    group by x1;
    quit; 
     
    proc sql;
    create table test5 as select x2 , count (x2) as nb2 from test3 where x2 ne ""
    group by x2;
    quit;
     
    proc sql;
    create table test6 as select a.x1 ,a.nb1,b.x2,b.nb2 from test4 as a  inner join test5 as b
    on a.x1=b.x2;
    quit; 
     
    data test7;
    set test6;
    retain nb3 0;
    if nb1<>nb2 then dif=abs(nb1-nb2);
    if nb1=nb2 then delete;
    nb3=nb3+dif;
    run;
     
    data test8(keep=nb3 var);
    set test7 end=last;
    length var $20.;
    if _n_=1 then var="";
    retain var;
    var=compress(catx('',var,x1));
    if last then output;
    run;
     
    data test9 (keep=var1 var2 nbtotal);
    merge test1 test8;
    nbtotal=sum(nb,nb3);
    run;
     
     
     
     
    proc append data=test9
                base=fin force;
    run;
     
    %mend test;
     
     
    data _null_ ;
    set init;
    call execute('%test(var1='||strip(var1)||', var2='||strip(var2)||' )');
    run;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  14. #14
    Membre du Club
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    décembre 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2014
    Messages : 65
    Points : 59
    Points
    59

    Par défaut

    Bonjour,

    Je reviens vers vous pour confirmer que la fonction complev me va très bien.

    Merci à vous

Discussions similaires

  1. [WD-2016] Inversion de lettres et des lignes
    Par Fouko dans le forum VBA Word
    Réponses: 5
    Dernier message: 27/11/2016, 06h40
  2. inverser des lettres et des chiffres
    Par hacker59 dans le forum VB.NET
    Réponses: 2
    Dernier message: 02/09/2013, 14h09
  3. Inversion des lettres d'un mot
    Par raphy20 dans le forum C++
    Réponses: 9
    Dernier message: 05/03/2012, 07h33
  4. [Débutant] Convertion lettres vers chiffres et inversement
    Par Clarinette95 dans le forum MATLAB
    Réponses: 20
    Dernier message: 30/06/2011, 20h26
  5. Réponses: 3
    Dernier message: 18/06/2007, 16h34

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