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 :

Remplacer 1 lettre par un nombre et reste d'une division pour 1 nombre trop grand


Sujet :

SAS Base

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    dataminer
    Inscrit en
    Juin 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : dataminer

    Informations forums :
    Inscription : Juin 2015
    Messages : 39
    Points : 33
    Points
    33
    Par défaut Remplacer 1 lettre par un nombre et reste d'une division pour 1 nombre trop grand
    Bonjour,

    je vous écris car j'ai 2 petits problèmes...

    1)J'aimerais remplacer dans un numéro d'IBAN (donc assez longue suite de chiffres et de lettres) les lettres par un nombre (A ==>10, B ==>11, etc).

    J'ai vu que tranwrd correspond à ce que je cherche mais comment lui dire en 1 fois ? je n'ai pas trop envie de faire 26 data set en remplaçant 1 lettre à chaque fois...

    exemple j'ai : iban= FR2180041026051921183X08642 qui deviendrais : 152721800410260519211833308642



    2)La taille du nombre pose problème : quand je veux faire la division du nombre par 97 pour avoir le reste, sas ne peut pas...

    exemple : mod(200410100514587833302896352245,97) sas n'y arrive pas :

    NOTE: Argument non valide pour la fonction MOD(2.004101E29,97) à la ligne 25 colonne 8.
    essai1=. _ERROR_=1 _N_=1
    NOTE: Mathematical operations could not be performed at the following places. The results of the operations have been set to
    missing values.
    Each place is given by: (Number of times) at (Line)Column).
    1 dans 25:8



    Quelqu'un aurait la solution ?


    Merci à tous!

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Pour 2) Une réponse "générale" et pas lié à SAS :

    Un découpage de 200410100514587833302896352245 ?

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mod(200410100514587833302896352245,97) = mod(200410100514587,97) * 10^15 + mod(833302896352245,97)
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    dataminer
    Inscrit en
    Juin 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : dataminer

    Informations forums :
    Inscription : Juin 2015
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    c'est ce que j'ai fais, mais les chiffres restent trop grand même en divisant par 2 le nombre de chiffres, du coup je pars sur :

    iban=abcdef...
    mod(a,97)=a1
    mod(a1*10+b,97)=b1
    ...

    c'est galere mais ça devrait aller.

  4. #4
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Il faudrait connaitre les limites des types employés ?
    Soit s'y conformer de façon la plus judicieuse (découpage des paquets de chiffres par groupe de par 5,10) , soit changer
    de type (ex ci dessous : short -> long long int) le temps d'un calcul ...
    ex :
    Un short pourra contenir, sous Linux, une valeur entre : -32768 et 32767
    Un unsigned short pourra contenir, sous Linux, une valeur entre : 0 et 65535
    Un int pourra contenir, sous Linux, une valeur entre : -2147483648 et 2147483647
    Un unsigned int pourra contenir, sous Linux, une valeur entre : 0 et 4294967295
    Un long int pourra contenir, sous Linux, une valeur entre : -2147483648 et 2147483647
    Un unsigned long int pourra contenir, sous Linux, une valeur entre : 0 et 4294967295
    Un long long int pourra contenir, sous Linux, une valeur entre : -9223372036854775808 et 9223372036854775807
    Un unsigned long long int pourra contenir, sous Linux, une valeur entre : 0 et 18446744073709551615
    Le tout c'est que ça marche, il y aura peut-être un spécialiste SAS qui passera entre temps
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  5. #5
    Candidat au Club
    Femme Profil pro
    technicien réseaux
    Inscrit en
    Novembre 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : Tunisie

    Informations professionnelles :
    Activité : technicien réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2016
    Messages : 1
    Points : 2
    Points
    2
    Par défaut aide
    salut tt le monde !! comment faire un script qui donne le nombre de fichiers et de répertoires , svp ?

  6. #6
    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,

    Pour la question 1, 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 test;
    input var1 $50.;
    cards;
    FR2180041026051921183X08642
    ;
    run;
     
    data test1 (drop =i j);
    set test;
    length var2 $100.;
    retain var2;
    var2="";
    do i =1 to length(var1)+1;
      j=substr(var1,i,1);
            if j IN ('a','A') THEN j=10;
            else if j IN ('b','B') THEN j=11;
    	else if j IN ('c','C') THEN j=12;
    	else if j IN ('d','D') THEN j=13;
    	else if j IN ('e','E') THEN j=14;
    	else if j IN ('f','F') THEN j=15;
    	else if j IN ('g','G') THEN j=16;
    	else if j IN ('h','H') THEN j=17;
    	else if j IN ('i','I') THEN j=18;
    	else if j IN ('j','J') THEN j=19;
    	else if j IN ('k','K') THEN j=20;
    	else if j IN ('l','L') THEN j=21;
    	else if j IN ('m','M') THEN j=22;
    	else if j IN ('n','N') THEN j=23;
    	else if j IN ('o','O') THEN j=24;
    	else if j IN ('p','P') THEN j=25;
    	else if j IN ('q','Q') THEN j=26;
            else if j IN ('r','R') THEN j=27;
    	else if j IN ('s','S') THEN j=28;
    	else if j IN ('t','T') THEN j=29;
    	else if j IN ('u','U') THEN j=30;
    	else if j IN ('v','V') THEN j=31;
    	else if j IN ('w','W') THEN j=32;
    	else if j IN ('x','X') THEN j=33;
    	else if j IN ('y','Y') THEN j=34;
    	else if j IN ('z','Z') THEN j=35;
    var2=compress(catx('',var2,j));
    end;
     
    run;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 133
    Points : 371
    Points
    371
    Par défaut
    Bonjour

    pour votre problème de refus du calcul du reste au moyen de la fonction MOD, l'entier le plus élevé que vous pouvez enregistrer dans une variable numérique SAS codée sur 8 octets, c'est 9 007 199 254 740 992.

    conclusion : 200 410 100 514 587 833 302 896 352 245 ne peut pas être modalité d'une variable numérique dans une table SAS:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    data test;
    x=200410100514587833302896352245;
    run;
    proc print;
    format x 32. ;
    run;
    et vous allez voir qu'au lieu de
    200410100514587833302896352245

    vous aurez :
    200410100514587831720510226432

    votre "chiffre" devra donc être impérativement être stocké dans une variable caractère...

    ce petit programme répondra (normalement... je vous laisse vérifier...) à votre besoin :

    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
     
    data test;
       length plic $ 25. ;
       x="200410100514587833302896352245";
       copie=x;
       do until (length(copie)<=15);
          pif=int(length(copie)/2);
          part1=put(mod(input(substr(copie,1,pif),25.),97),25.);
          part2=put(mod(input(substr(copie,pif+1),25.),97),25.);
          if part2=0 then correctif=0;
    	     else if 1<=part2<=9 then correctif=1;
    	     else correctif=2;
          plic=repeat("0",length(copie)-pif-1-correctif);
          copie=cats(part1,plic,part2);
       end;
       final=mod(input(copie,25.),97);
       * drop copie plic part1 part2 ;
    run;
    Ce programme ne fonctionnera pas si le "grand nombre" contient plus de 31 chiffres (avec 32, vous prenez un risque, avec 33 c'est forcément faux). Il ne fonctionnera pas non plus si le nombre par lequel vous souhaitez diviser pour obtenir un reste est strictement supérieur à 99.

    cordialement

    Sébastien Ringuedé

    EDIT : une petite erreur dans la première version postée... en espérant que celle-ci fonctionne bien...

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    dataminer
    Inscrit en
    Juin 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : dataminer

    Informations forums :
    Inscription : Juin 2015
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    j'ai fais comme ça et à priori ça fonctionne bien.

    %macro longueur;
    %do z=14 %to 35;
    proc sql;
    create table long&z. as
    select *
    from VERIF4
    where longueur=&z.
    ;
    quit;
    /*etape1 */
    proc sql;
    create table long&z. as
    select IBAN,
    IBAN2,
    longueur,
    input(substr(IBAN2,1,1),1.) as a1,
    mod(calculated a1,97) as rra1
    from long&z.
    ;
    quit;
    /*4) */
    %macro boucle;
    %do j=1 %to &z. ;
    %let k= %eval(&j.+1);
    proc sql;
    create table long&z. as
    select IBAN,
    IBAN2,
    longueur,
    rra&j.,
    input(substr(IBAN2,&k.,1),1.) as a&k.,
    rra&j.*10+ calculated a&k. as ra&k.,
    mod(calculated ra&k.,97) as rra&k.
    from long&z.
    ;
    quit;
    %end;
    %mend;
    %boucle;
    %end;
    %mend;
    %longueur;


    %macro rra;
    %do i=14 %to 35;
    data long&i.(rename=(rra&i.=rra_final));
    set long&i.(keep=IBAN IBAN2 longueur rra&i.);
    run;
    %end;
    %mend;
    %rra;

    ps : si vous êtes vraiment le Sebastien Ringuedé qui avait écrit le livre "SAS : introduction au décisionnel : du data management au reporting" je vous remercie car ce bouquin m'a bien aidé dans ma période avant mon 1er job (ça rassure de repartir de 0 et revoir un peu de tout).

    Axel

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 133
    Points : 371
    Points
    371
    Par défaut
    c'est bien moi... (et si ce bouquin est utile, alors tant mieux ;-))

    pour la première partie de votre question (remplacement des lettres par des chiffres que j'ai transformé en un exercice pour mon site), vous pouvez utiliser ce programme :

    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 test ;
    input x $ ;
    cards;
    A124B145
    B165C144
    C478c558
    a485z554
    12a54A88
    AAA12345
    ;
     
    data test2(drop=i) ;
       length x $ 200 ;
       set test;
       do i=1 to 26 ;
          x=tranwrd(UPCASE(x),byte(64+i),put(i+9,2.));
       end;
    run;
    cordialement

    Sébastien Ringuedé

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

Discussions similaires

  1. Remplacer les lettres par un caractère
    Par Many31 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/08/2009, 18h45
  2. recuperation du reste d'une division
    Par eli1957 dans le forum Sybase
    Réponses: 3
    Dernier message: 14/06/2007, 09h35
  3. Reste d'une division et partie entier.
    Par vanilla94 dans le forum Langage
    Réponses: 4
    Dernier message: 28/11/2006, 19h14
  4. Tri d'une JTable pour des nombres
    Par chasse dans le forum Composants
    Réponses: 2
    Dernier message: 20/04/2006, 15h25
  5. Une unité pour gérer des très grands nombres
    Par M.Dlb dans le forum Langage
    Réponses: 2
    Dernier message: 09/09/2003, 12h07

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