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 :

Créations de table selon les valeurs d'une variable


Sujet :

SAS Base

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Créations de table selon les valeurs d'une variable
    Bonjour, j'ai longuement hésité à m'inscrire ici, vu que pour le moment j'arrivais à jongler suffisamment sur Internet pour resoudre mes problèmes sous SAS.

    Donc voilà :

    Je dispose d'une table, nommée ventes. Seulement, elle est trop volumineuse, et je souhaite créer autant de tables-filles qu'il existe de modalités pour une variable (ACTIVITE). Il existe plusieurs centaines d'activités, c'est pourquoi je souhaite la création de plusieurs centaines de tables.

    La solution "kimarche" étant fastidieuse, est celle de faire des macros, et de donner en macro-variable le nom de chaque activité. Le problème, c'est la multitude de modalités de la variable ACTIVITE qui m'obligerait à créer plusieurs centaines d'appels de macro. Cela marche ainsi, mais point de vue code, je ne trouve pas ça optimal.

    Je préfère une solution ou SAS reconnait les codes activités et crée automatique une table en sortie, dont le nom contient au minima le nom de l'activité.

    Structure de la table :
    ACTIVITE : caractères (5)
    PERIODE : caractères (4)
    CAHT : numérique

    Peut-être une solution du côté de la proc SQL edit : ou de l'utilisation de call symput ? J'ai déjà utilisé le call symput auparavant, mais là je sèche un peu

    Merci pour votre réponse.

    edit 2 : tant que j'y suis, connaissez-vous un moyen de forcer la création d'un répertoire windows lors d'un libname, même si ce répertoire n'existe pas encore ?

  2. #2
    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 : 51
    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
    Pourquoi ce n'est pas optimal ?

    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
    filename mprint 'c:\temp\code en clair.txt';
    options mfile mprint;
     
     
    /* reconnaissance des activités*/
    Proc sort data=table (keep=activite) nodupkey out=activite;
    by activite;
     
    /*enregistrement des activités */
    data _null_;
    set activite ;
    call symputx( cats('act',_n_) , activite);
    call symputx( 'nbobs' , _n_);
    run;
     
    /* Split */
    data  %do i = 1 %to &nbobs ; fille_&&act&i %end; ; 
    set table ;
     
    if activite = "&act1" then output fille_&act1 ;
     
    %do i = 2 %to &nbobs ;
      else if activite = "&&act&i" then output fille_&&act&i ;
    %end;
     
    run;
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci pour la réponse je l'épluche demain matin.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 249
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    En ce qui concerne la question subsidiaire, tu trouveras un macro-programme de steelspirit DirExist qui devrait t'inspirer !

    Bon courage !

  5. #5
    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 : 51
    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
    Attention, la création d'un répertoire sous windows 2003 server demande à avoir des droits supplémentaires sur cmd.exe du serveur : si tu as des erreurs là où il ne devrait pas y en avoir, c'est à cause de cela.
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par datametric Voir le message
    Pourquoi ce n'est pas optimal ?
    Parce que je cherche à faire fonctionner un programme qui mette le moins de temps possible à l'exécution.

    Merci pour direxist, mais je pensais qu'il y avait une option plus simple, à l'instar de REPLACE dans une proc export qui permet de remplacer un fichier existant.

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par datametric Voir le message
    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
    filename mprint 'c:\temp\code en clair.txt';
    options mfile mprint;
     
     
    /* reconnaissance des activités*/
    Proc sort data=table (keep=activite) nodupkey out=activite;
    by activite;
     
    /*enregistrement des activités */
    data _null_;
    set activite ;
    call symputx( cats('act',_n_) , activite);
    call symputx( 'nbobs' , _n_);
    run;
     
    /* Split */
    data  %do i = 1 %to &nbobs ; fille_&&act&i %end; ; 
    set table ;
     
    if activite = "&act1" then output fille_&act1 ;
     
    %do i = 2 %to &nbobs ;
      else if activite = "&&act&i" then output fille_&&act&i ;
    %end;
     
    run;

    2 questions me viennent à l'esprit :

    - Le double & : je ne l'ai jamais utilisé, mais je suppose qu'il agit comme une macro-variable double (ou meta) ?
    - le programme s'exécute seulement au sein d'une macro, à cause de la boucle %do ?

  8. #8
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Pour optimiser encore la solution de Datametric (qui limite la lecture de la grosse table à 2 passages, un pour la proc Sort et un pour l'étape Data), on pourrait utiliser une proc Freq au lieu de la proc Sort et un SELECT WHEN au lieu du IF THEN ELSE : en ordonnant les WHEN par fréquences décroissantes, on évite les tests inutiles.

    Edit : uniquement dans un macro-programme à cause du %DO, exact.
    Edit : pour les &&, les règles de lecture sont les suivantes :
    • &nomMv --> valeur de la macro-variable nomMV
    • &nomMV. --> valeur de la macro-variable nomMV
    • && --> &
    • texte --> texte
    • s'il reste des & après la vague de transformations, on fait un autre passage

    En mettant que i vaut 1, qu'il existe une macro-variable ACT qui vaut TOTO et une macro-variable ACT1 qui vaut 350, alors
    act&i --> act1
    &act&i --> TOTO1
    &&act&i --> &act1 --> 350 en 2 lectures successives (&&-->&, act-->act, &i --> 1 pour la 1e lecture)

    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
    /* reconnaissance des activités*/
    ODS EXCLUDE ALL ;
    ODS OUTPUT oneWayFreqs=activite;
    Proc FREQ DATA=TABLE (keep=activite) ORDER=FREQ 
    TABLE activite;
    RUN ;
    ODS SELECT ALL ;
    /*enregistrement des activités */
    DATA _null_;
    SET activite ;
    call symputx( cats('act',_n_) , activite);
    call symputx( 'nbobs' , _n_);
    run;
     
    /* Split */
    DATA  %do i = 1 %TO &nbobs ; fille_&&act&i %end; ; 
    SET TABLE ;
    SELECT (activite) ; 
    %do i = 1 %TO &nbobs ;
      WHEN ("&&act&i") output fille_&&act&i ;
    %end;
    OTHERWISE ;
    END ; 
    run;
    Olivier

    PS : pourquoi hésiter longuement à s'inscrire ? On n'est pas obligé de ne faire que poser des questions, on peut aussi proposer des réponses ! Ca sert aussi à ça de s'inscrire et je suis sûr que tu auras de très bonnes contributions.
    Bon courage.
    Olivier

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Longuement hésité, le temps d'acquérir une culture SAS, maintenant c'est fait, je peux apporter ma pierre à l'édifice !

  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 : 51
    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
    Merci Olivier.

    Remarque : Je ne dirais pas que je n'évite pas les test inutiles, mais que je priorise les tests de sorte à remplir les conditions les plus fréquentes en premier.

    Le case /when des étapes DATA est plus optimisé que le IF/ELSE IF au niveau algo interne de SAS car il a été écrit plus tard mais le principe reste le même puisque les conditions renvoient TRUE/FALSE pour pouvoir fonctionner.
    Dans le deux cas, les conditions sont testées jusqu'à obtenir la bonne, en positionnant la plus fréquentes en amont, SAS passe à la ligne suivante plus rapidement.

    Ce résultat est plus spectaculaire si l'on compare au IF/THEN. Dans ce cas, toutes les conditions sont testés sur chaque ligne.
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/07/2011, 15h25
  2. Affichage d'une table selon les critères d'une autre
    Par trifly dans le forum Requêtes
    Réponses: 5
    Dernier message: 27/05/2011, 09h24
  3. Réponses: 18
    Dernier message: 09/12/2010, 20h40
  4. [AC-97] Update d'une table selon les données d'une autre
    Par coyote90 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 06/11/2009, 15h44
  5. [VB6]Mettre à jour une table avec les valeurs d'une DATAGrid
    Par mbzhackers dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 26/05/2006, 20h56

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