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

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    février 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 4
    Points : 4
    Points
    4

    Par défaut Mettre à jour une table en bouclant tant que la valeur d'une colonne est présente dans une autre colonne

    Bonjour,

    Je suis novice en programmation SAS. Je suis coincée, je n'arrive pas du tout à trouver de solution. Alors si vous pouviez m'aider svp... J'ai cherché dans le forum mais je ne trouve aucune réponse à mon problème...
    J'ai une table comme dans le modèle ci-dessous que je dois mettre à jour.
    J'ai des lignes (non triées) qui peuvent être rattachées les unes aux autres en rapprochant les valeurs de la colonne ID de celles de la colonne ID2. Mon objectif est d'obtenir un identifiant unique pour toutes les lignes qui sont rapprochables. J'ai mis dans la colonne "REF_LIG" un exemple de ce que je voudrais obtenir.

    J'ai testé un proc sql avec UPDATE. ça fonctionne une fois, mais ça ne boucle pas autant de fois que je voudrais. Je souhaiterai répéter mon action autant de fois que je trouve une valeur de ID dans ID2.

    Type ID ID2 REF_LIG
    A J1N1 J1N1 J1N1
    A K1N1 K1N1 K1N1
    B J2N2 J1N1 J1N1
    B J3N3 J2N2 J1N1
    B K2N2 K1N1 K1N1
    B J4N4 J3N3 J1N1
    B K3N3 K2N2 K1N1

    Merci beaucoup pour votre aide.

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

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

    Informations forums :
    Inscription : mai 2011
    Messages : 675
    Points : 1 562
    Points
    1 562

    Par défaut

    Bonjour,

    si ton fichier n'est pas trop volumineux il est possible que cette discussion te donne une solution pas trop difficile à adapter
    http://www.developpez.net/forums/d14...-meme-famille/


    Bon courage

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    février 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 4
    Points : 4
    Points
    4

    Par défaut

    Bonjour,

    Merci pour la réponse. Malheureusement je n'arrive pas à adapter le code. De plus, je peux avoir des millions de lignes à traiter...
    Dans mon exemple (repris ci-dessous), les lignes 1, 3, 4, 6 doivent être rapprochées pour pouvoir porter l'identifiant de la ligne 1 (REF_LIG = J1N1). Or je n'arrive à les rapprocher que 2 par 2 (en rapprochant ID de ID2), et je n'arrive pas à les trier (car il peut y avoir entre mes lignes d'autres lignes qui n'ont rien à voir). Et j'avoue qu'avec le hash je n'ai pas réussi non plus.
    Je débute, donc je ne connais pas encore toutes les possibilités de SAS.

    Et y aurait-il un moyen de faire : tant que je trouve une valeur d'une colonne A dans une colonne B, alors je remplace la valeur de A par celle de B. Cette opération peut se répéter plusieurs fois (récursivité?).

    Type ID ID2 REF_LIG
    1 A J1N1 J1N1 J1N1
    2 A K1N1 K1N1 K1N1
    3 B J2N2 J1N1 J1N1
    4 B J3N3 J2N2 J1N1
    5 B K2N2 K1N1 K1N1
    6 B J4N4 J3N3 J1N1
    7 B K3N3 K2N2 K1N1

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

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

    Informations forums :
    Inscription : mai 2011
    Messages : 675
    Points : 1 562
    Points
    1 562

    Par défaut

    "De plus, je peux avoir des millions de lignes à traiter..."

    De fait combien de lignes as tu à traiter ?

  5. #5
    Membre averti
    Inscrit en
    juillet 2006
    Messages
    361
    Détails du profil
    Informations forums :
    Inscription : juillet 2006
    Messages : 361
    Points : 317
    Points
    317

    Par défaut

    Bonjour,

    Voici une solution utilisant des formats et une macro qui nécessite toutefois de paramétrer un nombre d'itérations au préalable. Il y a sans doute d'autres pistes mais ça a le mérite de fonctionner.

    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
    data decodage;
    input typee id $ code1 $ code2 $;
    cards;
    1 A c1 c1
    2 A d1 d1
    3 B c2 c1
    4 B c3 c2
    5 B d2 d2
    6 B c4 c3
    7 B d3 d2
    8 B d4 d3
    9 B c5 c4
    10 B c6 c5
    ;
    run;
     
    proc sql;
    create table decodage2 as 
    select distinct code1, code2
    from decodage;
    quit;
     
    data espionnage;
    	set decodage2(rename=(code1=start code2=label));
    	fmtname = '$espion';
    run;
     
    proc format cntlin=espionnage;
    run;
     
    %macro decode(iteration);
    data machin_&iteration.;
    set decodage;
    	resultat= %do i=1 %to &iteration.; put( %end;
    		put(code1,espion.)
    			%do j=1 %to &iteration.; ,espion.) %end;;
    run;
    %mend;
    %decode(0);
    %decode(1);
    %decode(4);

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    février 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 4
    Points : 4
    Points
    4

    Par défaut

    Bonsoir !

    Je vous remercie tous d'avoir prêté attention à mon problème. En continuer de chercher de manière acharnée, j'ai finalement trouvé une solution qui fonctionne a priori. Je dois faire encore quelques tests.

    Le 1er message de JeromeMATHIAS qui m'a orientée vers la method HASH m'a permis de trouver un moyen de faire de la récursivité avec cette méthode. J'ai trouvé la solution sur : http://www2.sas.com/proceedings/forum2008/029-2008.pdf

    Avec le code suivant du document :

    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 members_update(drop=rc ); 
      if 0 then set old_new_xwalk;                
      dcl hash xwalk (dataset:  'old_new_xwalk'); 
        xwalk.definekey ('old_id'); 
        xwalk.definedata ('new_id'); 
        xwalk.definedone (); 
      do until (eof); 
         set members end=eof; 
         new_id = ' '; 
         old_id = member_id; 
         do lookups = 1 by 1 until (rc ne 0 or lookups > 1000);   
          rc = xwalk.FIND(); 
          old_id = new_id; 
        end;      
        output; 
      end; 
    stop; 
    run;
    Je vous remercie vraiment de votre aide.

    A bientôt !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/02/2010, 04h45
  2. [VBA] fonction qui donne la valeur présente dans une table
    Par zanou666 dans le forum VBA Access
    Réponses: 7
    Dernier message: 25/09/2007, 18h33
  3. Utiliser la valeur d'un limit présent dans une table
    Par gwena54 dans le forum PHP & MySQL
    Réponses: 3
    Dernier message: 02/07/2007, 22h08
  4. Réponses: 4
    Dernier message: 25/06/2007, 16h05
  5. Réponses: 1
    Dernier message: 09/04/2007, 22h20

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