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 :

Conserver les résultats des macros dans fichier externe


Sujet :

Macro

  1. #1
    Membre actif
    Inscrit en
    Novembre 2003
    Messages
    543
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 543
    Points : 239
    Points
    239
    Par défaut Conserver les résultats des macros dans fichier externe
    Bonjour,
    Je cherche à appeler une macro plusieurs fois et à conserver les résultats dans un fichier externe.
    Mon programme est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     %macro Essai(Variable);
       data _null_;
          set sashelp.class;
          put _N_ &Variable;
       run;
    %mend Essai;
    data _null_;
       file 'D:\Essai.txt';
       call execute ('%Essai( Name   )' );
       call execute ('%Essai( Sex    )' );
       call execute ('%Essai( Age    )' );
       call execute ('%Essai( Height )' );
       call execute ('%Essai( Weight )' );
    run;
    Le résultat des appels de macro s'affiche dans la LOG.
    Mais ce n'est pas ce que je veux ; je souhaiterais que ces résultats soient écris dans mon fichier ESSAI.TXT.
    Quelqu'un saurait-il résoudre cette question ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : Japon

    Informations forums :
    Inscription : Janvier 2008
    Messages : 36
    Points : 331
    Points
    331
    Par défaut
    Bonjour,

    Le file doit être dans l'étape data où tu lis ta table.
    Pour concaténer les fichiers tu peux utiliser l'option mod de l'instruction file.

    J'ai rajouté la suppression du fichier pour ne pas toujours concaténer à chaque relance.

    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
     
    %macro Essai(Variable);
       DATA _null_;
          file 'D:\essai.txt' mod ;
          SET sashelp.class;
          put _N_ &Variable;
       run;
    %mend Essai;
     
    /* suppression du fichier */
    data _null_ ;
       if fileexist('D:\essai.txt') then do ;
          rc = filename('todel','D:\essai.txt');
          rc = fdelete('todel') ;
       end ;
    run ;
     
    DATA _null_;
       call execute ('%Essai( Name   )' );
       call execute ('%Essai( Sex    )' );
       call execute ('%Essai( Age    )' );
       call execute ('%Essai( Height )' );
       call execute ('%Essai( Weight )' );
    run;
    Timarsu.

  3. #3
    Membre actif
    Inscrit en
    Novembre 2003
    Messages
    543
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 543
    Points : 239
    Points
    239
    Par défaut
    Ouaaaaaaaahhhhhhhh

    it's all right !

    Merci Timarsu

  4. #4
    Membre habitué
    Homme Profil pro
    sas help desk et installateur
    Inscrit en
    Mai 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : sas help desk et installateur
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2010
    Messages : 41
    Points : 143
    Points
    143
    Par défaut
    Ericnat

    Par la filière ods en 9.3 avec les réglages par défaut, on pourrait faire ceci
    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
     
     
     
     
    %macro Essai(Variable);
       DATA _null_;
       file print ods=(variables=(_n_ &variable));
          SET sashelp.class;
          *put _N_ &Variable;
    	  put  _ods_;
       run;
    %mend Essai;
     
    ods html close;
    ods noresults;
    ods csv file="D:\temp\ericnat.csv" ;
    DATA _null_;
      * file 'D:\temp\ericnat.txt' ;
     
       call execute ('%Essai( Name   )' );
       call execute ('%Essai( Sex    )' );
       call execute ('%Essai( Age    )' );
       call execute ('%Essai( Height )' );
       call execute ('%Essai( Weight )' );
    run;
     
    ods csv close; 
    ods results;
    ods html path= "%sysfunc(pathname (work)) ";

    Résultat en csv si on veut ensuite récupérer les données mais on aurait pu faire rtf ou excel

  5. #5
    Membre actif
    Inscrit en
    Novembre 2003
    Messages
    543
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 543
    Points : 239
    Points
    239
    Par défaut
    J'hésite toujours à utiliser les possibilités de l'ODS qui me semblent compliqué.
    Et je ne saurais pas l'utiliser non plus si je complexifis mon problème de départ en utilisant aussi le fichier de sortie dans la première étape data, de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    filename Essai 'D:\essai.txt';
    %macro Essai(Variable);
       DATA _null_;
          file Essai mod;
          SET sashelp.class;
          put _N_ &Variable;
       run;
    %mend Essai;
    DATA _null_;
       file Essai;
       put "Un premier entête"; call execute ('%Essai( Name   )' );
       put "et voici le second"; call execute ('%Essai( Sex    )' );
    run;
    J'obtiens une sortie avec tous mes entêtes en début de fichier ; comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Un premier entête
    et voici le second
    1 Alfred
    2 Alice
    ...
    1 M
    2 F
    ...
    Y-t-il un moyen que les écritures se fassent dans l'ordre, c'est à dire comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Un premier entête
    1 Alfred
    2 Alice
    ...
    et voici le second
    1 M
    2 F
    ...

  6. #6
    Membre habitué
    Homme Profil pro
    sas help desk et installateur
    Inscrit en
    Mai 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : sas help desk et installateur
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2010
    Messages : 41
    Points : 143
    Points
    143
    Par défaut
    Réponse disons codée mais absolument relative à votre façon de faire appel à call execute
    En SAS il y a toujours plusieurs manières de faire


    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
     
    %macro Essai(Variable);
       DATA _null_;
       file print ods=(variables=(_n_ &variable));
          SET sashelp.class;
          *put _N_ &Variable;
    	  put  _ods_;
       run;
    %mend Essai;
     
    %macro entete(texte);
    data _null_;
    file print ods=(variables=(texte));
         texte="&texte";
    	  put  _ods_;
    run;
    %mend;
     
     
    ods html close;
    ods noresults;options nonumber nodate; title ;
    ods tagsets.excelxp file="d:\temp\ericnat3.xml" style=journal ;
    ods csv file="D:\temp\ericnat.csv" ;
    ods rtf file="D:\temp\ericnat2.rtf" style= journal2  startpage=never ;
    ods html(id=1) file="d:\temp\ericnat1.xls" style=minimal ;
    DATA _null_;
      * file 'D:\temp\ericnat.txt' ;
       call execute ('%entete( tout depend du pourquoi vous voulez)' );
       call execute ('%Essai( Name   )' );
       call execute ('%entete( ces informations comme cela )' ); 
       call execute ('%Essai( Name   )' );
      call execute ('%entete( J''avoue n''avoir pas réussi )' ); 
       call execute ('%Essai( Sex    )' );
      call execute ('%entete( par la filière ods output )' ); 
       call execute ('%Essai( Age    )' );
      call execute ('%entete( car l''objet est issu de l''étape data )' ); 
       call execute ('%Essai( Height )' );
      call execute ('%entete( et je n''ai pas essayé avec la prog objet dans l''etape data )' ); 
       call execute ('%Essai( Weight )' );
    run;
    ods html(id=1) close;
    ods csv close; 
    ods rtf close;
    ods tagsets.excelxp close;
    ods results;
    ods html path= "%sysfunc(pathname (work)) ";
    Pour avoir une idée de ce qui est possible en programmation objet dans l'étape data jetez un oeil
    sur cette façon de faire un codebook (et cela marche je l'ai testé)
    http://www.mathematica-mpr.com/publi...axter_2013.pdf

    Mon exemple montre en tout cas le caractère tabulaire de l'ODS.
    Ecrire une ligne se fera plus par ods text= et les nouveautés de la 9.4.


    AW

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/11/2010, 14h25
  2. Réponses: 6
    Dernier message: 15/04/2009, 10h33
  3. Réponses: 3
    Dernier message: 15/05/2008, 16h06
  4. Réponses: 2
    Dernier message: 16/04/2008, 20h06
  5. Réponses: 8
    Dernier message: 27/12/2007, 12h55

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