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

Macro Discussion :

Extraire des données sous sas en créant des tables dynamiques


Sujet :

Macro

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Extraire des données sous sas en créant des tables dynamiques
    Bonjour,

    Bonjour,
    J'ai cette table, je veux extraire des données, suivant un critére.mes trois
    champs sont L1, L2, L3
    L1 L2 L3
    b 1 j
    c 1 k
    c 2 l
    d 2 m
    d 3 n
    d 3 u

    Je veux créer trois tables à savoir :

    T1 :

    b 1 j
    c 1 k

    T2:

    c 2 l
    d 2 m

    T3 :

    d 3 u
    d 3 n

    Cet exemple se porte sur une grosse base de donnée , donc
    je veux créer mes tables sans fixer de valeurs :je veux obtenir l'ensemble de mes tables en fixant dynamiquement les valeurs de la colonne L2.
    Est ce que quelqu'un à une idée sur cette question,Merci

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

    Encore une fois le macro langage SAS permet de résoudre ce type de problème !
    Le macro-programme mp_exploze utilise trois macro-variables :
    • mv_tabin : nom complet de la table en entrée
    • mv_var : nom de la variable dont les valeurs sont à exploser
    • mv_values : valeurs donnant lieu à création de table...


    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
    /* Création jeu d'essai */
    data work.Told ;
         input L1 $ L2 L3 $ ;
         cards;
    b 1 j
    c 1 k
    c 2 l
    d 2 m
    d 3 n
    d 3 u
    ;
    run;
    /* Macro programme */
    %macro mp_exploze (mv_tabin=work.Told, mv_var=L2, mv_values=1 2 3);
         data
              %do i = 1 %to 1+%sysfunc(countc(&mv_values," ")) ;
                   work.T&i
    	   %end ;
    	    work.Tautresvaleurs /* Jamais trop prudent ! */
                   ;
    		 set &mv_tabin ;
    		 select (&mv_var) ;
    	         %do i = 1 %to 1+%sysfunc(countc(&mv_values," ")) ;
    		 	when (%scan(&mv_values,&i," ")) output work.T&i ;
    		 %end ;
    		 otherwise output work.Tautresvaleurs ;
    		 end ;
    /* Test : %mp_exploze() ; */
    	RUN ;
    %mend mp_exploze ;
    Bon courage !

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 166
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    pour votre exemple il marche que pour les variables _numeric_

    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
     
    %macro mp_exploze (mv_tabin=work.Told, mv_var=L1, mv_values=b c d);
         DATA
              %do i = 1 %TO 1+%sysfunc(countc(&mv_values," ")) ;
                   work.T&i
    	   %end ;
    	    work.Tautresvaleurs /* Jamais trop prudent ! */
                   ;
    		 SET &mv_tabin ;
    		 SELECT (&mv_var) ;
    	         %do i = 1 %TO 1+%sysfunc(countc(&mv_values," ")) ;
    		 	when (%scan(&mv_values,&i," ")) output work.T&i ;
    		 %end ;
    		 otherwise output work.Tautresvaleurs ;
    		 end ;
    /* Test : %mp_exploze() ; */
    	RUN ;
    %mend mp_exploze ;
     
    message :
    NOTE: Valeurs alphanumériques converties en valeurs numériques aux positions indiquées par : (Ligne):(Colonne).
          1:1   1:1   1:1
    NOTE: Variable b non initialisée.
    NOTE: Variable c non initialisée.
    NOTE: Variable d non initialisée.
    NOTE: Données numériques incorrectes, 'b' , dans ligne 1 colonne 1.
    L1=b L2=1 L3=j b=. c=. d=. _ERROR_=1 _N_=1
    NOTE: Données numériques incorrectes, 'c' , dans ligne 1 colonne 1.
    L1=c L2=1 L3=k b=. c=. d=. _ERROR_=1 _N_=2
    NOTE: Données numériques incorrectes, 'c' , dans ligne 1 colonne 1.
    L1=c L2=2 L3=l b=. c=. d=. _ERROR_=1 _N_=3
    NOTE: Données numériques incorrectes, 'd' , dans ligne 1 colonne 1.
    L1=d L2=2 L3=m b=. c=. d=. _ERROR_=1 _N_=4
    NOTE: Données numériques incorrectes, 'd' , dans ligne 1 colonne 1.
    L1=d L2=3 L3=n b=. c=. d=. _ERROR_=1 _N_=5
    NOTE: Données numériques incorrectes, 'd' , dans ligne 1 colonne 1.
    L1=d L2=3 L3=u b=. c=. d=. _ERROR_=1 _N_=6
    NOTE:  6 observations copiées de la table WORK.TOLD.
    NOTE: La table WORK.T1 a 6 observations et 6 variables.
    NOTE: La table WORK.T2 a 0 observations et 6 variables.
    NOTE: La table WORK.T3 a 0 observations et 6 variables.
    NOTE: La table WORK.TAUTRESVALEURS a 0 observations et 6 variables.

  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 melmouj,

    pour votre exemple il marche que pour les variables _numeric_
    ...
    %macro mp_exploze (mv_tabin=work.Told, mv_var=L1, mv_values=b c d);
    Sans rien changer à la version initiale de mp_exploze que dire de cet appel ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %mp_exploze(mv_var=L1, mv_values='b' 'c' 'd') ;
    Si mv_var contient le nom d'une variable texte, il faut alors citer des chaînes de caractères dans mv_values !

    Bon courage !

  5. #5
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Je peux proposer ce code, par le biais d'une proc sql, qui va aller assez vite dans le cas d'une grosse table. Ma macro exporte directement le resultat sous Excel pour envoi, à partir d'un chemin :

    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
     
    %macro separ(ts=,repertoire=,fichier=,va=);
    %let extension=.xls;
    proc sql;
    create table temp as select distinct &va from &ts
    order by &va;
    run;
    data temp;
    set temp;
    id=_N_;
    call symput('n',put(id,8.));   
    run;
    %do i=1 %to &n;
    proc sql;
    create table a.temp2 as select e.* from &ts as e ,temp as b
    where b.&va. = e.&va. and b.id = &i;
    data a.temp2;
    set a.temp2;
    call symput('val',compress(put(&va,8.)));
    run;
    PROC EXPORT DATA= a.temp2                                                                                                                  
                  OUTFILE="&repertoire.&fichier.&val.&extension."                                                                                                           
                 DBMS=EXCEL2002 REPLACE; 
    run;
    %end;
    %mend;

Discussions similaires

  1. [XL-2010] Extraire des données sous conditions entre deux bornes
    Par benadry dans le forum Excel
    Réponses: 4
    Dernier message: 13/02/2015, 11h57
  2. Réponses: 3
    Dernier message: 20/01/2015, 09h18
  3. [OpenOffice][Tableur] Extraire des données sous openoffice calc ou excel
    Par y_lebourhis dans le forum OpenOffice & LibreOffice
    Réponses: 4
    Dernier message: 15/01/2013, 06h01
  4. Exporter des données sous forme de requetes
    Par Pasiphae dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 06/10/2004, 17h27
  5. mise a jours des données sous access
    Par puyopuyo dans le forum ASP
    Réponses: 4
    Dernier message: 25/05/2004, 12h46

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