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 :

Export en CSV de plusieurs tables SAS


Sujet :

Macro

  1. #1
    Candidat au Club
    Homme Profil pro
    Statistiques
    Inscrit en
    Octobre 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Statistiques

    Informations forums :
    Inscription : Octobre 2020
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Export en CSV de plusieurs tables SAS
    Bonjour,

    Je travaille sur SAS depuis peu et je bloque sur une automatisation de procédure. Je dois convertir des tables SAS au format csv.
    Pas de problème pour effectuer cette tâche fichier par fichier avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    LIBNAME CONV "chemin de mon fichier";
     
    PROC EXPORT DATA = CONV.nom_fichier
    	OUTFILE = "C:\emplacement_destination_fichier\nom_fichier.csv"
    	DBMS = csv
    	REPLACE;
    	DELIMITER = ";";
    RUN;
    Jusqu'ici tout va bien. Seulement, j'aimerais automatiser cette tâche car j'ai beaucoup de fichiers à convertir.
    Dans mon programme SAS j'aimerais juste avoir à modifier le chemin des tables SAS à convertir et le chemin de destination des fichiers csv exportés.
    Il faudrait également que les fichiers csv portent le même nom que la table SAS correspondante.

    J'ai essayé la macro suivante sans succès :

    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
    %let libor = C:\...\Tables;   => emplacement des tables SAS à convertir
    %let libdes = C:\...\Out;     => emplacement de destination des fichiers csv
     
    LIBNAME LIBTAB "&libor";
    LIBNAME LIBOUT "&libdes";
     
     
    %MACRO CONVERT (libor=,libdes=)
    PROC EXPORT DATA = &libor.
    	OUTFILE = &libdes.
    	DBMS = csv
    	REPLACE;
    	DELIMITER = ";";
    RUN;
    %MEND CONVERT
     
    %CONVERT (libor=LIBTAB._ALL_,libdes=LIBOUT)

    Je vous remercie pour votre aide.
    A bientôt !

  2. #2
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 707
    Points : 1 320
    Points
    1 320
    Par défaut Boucle sur plusieurs tables
    Bonjour,

    Il y a deux aspects dans votre demande :

    • passer des chemins en paramètre
    • boucler sur les tables d'un répertoire

    Une proposition :

    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
    %macro convert(path1, path2);
      libname libor &path1;
      %let path2 = %sysfunc(dequote(&path2));
     
      proc sql noprint;
        select memname into : liste separated by " "
          from dictionary.tables 
          where upcase(libname) = "LIBOR";
      quit;
     
      %do i=1 %to %sysfunc(countw(&liste));
        %let table = %sysfunc(scan(&liste,&i));
        proc export data = libor.&table
          outfile = "&path2.\&table..csv"
          dbms = csv
          replace;
          delimiter = ";";
        run;
      %end;
    %mend;
     
    %convert("D:\temp\sas", "D:\temp\csv");
    Lien utile : https://www.developpez.net/forums/d1...sieurs-tables/

    Cordialement,

  3. #3
    Candidat au Club
    Homme Profil pro
    Statistiques
    Inscrit en
    Octobre 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Statistiques

    Informations forums :
    Inscription : Octobre 2020
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Je vous remercie pour votre retour. J'avais finalement réussi à trouver une solution avec le code ci-dessous mais je garde la vôtre de côté car elle pourra sans doute me servir plus tard :

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    /*------------------------------------------------------------------------------------------------------------*/
    /*  														               			          */
    /*						 PROGRAMME DE CONVERSION AU FORMAT CSV		                                  */
    /*  																			  */
    /*------------------------------------------------------------------------------------------------------------*/
     
    /* A faire : renseigner les chemins des tables en entrée et la destination des fichiers convertis (libor et libdes)
    et modifier le chemin des tables d'origine dans le filename */ 
     
     
    	/* Dossier où sont stockées les tables en entrée */
     
    %let libor = ...\Tables;
     
    	/* Dossier de destination des fichiers convertis */
     
    %let libdes = ...\Out;
     
     
    /* On crée 2 bibliothèques SAS qui vont chercher les 2 chemins précédemment renseignés pour pouvoir ouvrir nos tables
    dans la session SAS et effectuer quelques contrôles */
     
    LIBNAME LIBTAB "&libor.";
    LIBNAME LIBOUT "&libdes.";
     
     
    /* Ici on liste les membres de la bibliothèque des fichiers d'origine à convertir (renseigner le même chemin que libor) */
     
    filename listfich pipe 'DIR ...\Tables /b';
     
     
    /* Puis on stocke le résultat, à savoir la liste des noms de fichiers à convertir dans LIBOUT.listfich */
     
    data LIBOUT.listfich;
        length nomfich $80;
        infile listfich truncover;
        input nomfich $80.;
    	%global nbr_fich;
        call symput ('nbr_fich',_n_);
    run;
     
     
    /* On va ensuite stocker dans une macro-variable mv&i les noms de tables stockés dans listfich  */
     
    data _null_ ;
         set LIBOUT.listfich;
    	 i + 1;
    	 output;
    	 call symput (compress("mv"||i),substr(compress(nomfich),1,length(nomfich)-9)) ;
    run;
     
     
    /* On réalise enfin la conversion des tables SAS en CSV du dossier d'origine vers le dossier de destination */
     
    %macro export;
    	%do i = 1 %to &nbr_fich;		
    		proc export data=LIBTAB.&&mv&i
    		outfile= "&libdes\&&mv&i...csv"
    		dbms = CSV replace;
    		DELIMITER = ";" ;
    		run;
    	%end ;
    run ;
    %mend export;
    %export
    J'aurais une question supplémentaire. Il faudrait que les fichiers csv soient encodés au format UTF-8. Or il me semble que l'encodage par défaut dans SAS est au format WLATIN1. Est-il possible dans mon code ci-dessus de modifier l'encodage ? Merci.

  4. #4
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 707
    Points : 1 320
    Points
    1 320
    Par défaut proc export encodage
    Bonjour,

    Il faut définir l'encodage dans un filename :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    filename fic_out "D:\temp\fichier.csv" encoding="utf-8";
     
    proc export data=toto
                outfile=fic_out 
                dbms=csv replace;
         putnames=yes;
    run;
    Cordialement,

  5. #5
    Candidat au Club
    Homme Profil pro
    Statistiques
    Inscrit en
    Octobre 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Statistiques

    Informations forums :
    Inscription : Octobre 2020
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Si je comprends bien, il faut que je crée un nouveau filename juste avant ma macro export csv avec comme chemin le dossier où je veux exporter mes fichiers ?

    Cordialement,

  6. #6
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 707
    Points : 1 320
    Points
    1 320
    Par défaut filename
    Bonjour,

    Le filename permet de définir le chemin mais aussi le nom du fichier et d'ajouter des paramètres comme l'encodage ou la longueur de l'enregistrement (utile pour l'import, voir ici).

    Si vous définissez le filename avant la macro, les fichiers vont s'écraser au fur et à mesure. Il faut mettre l'instruction dans la boucle avant la proc export.

    Cordialement,

  7. #7
    Candidat au Club
    Homme Profil pro
    Statistiques
    Inscrit en
    Octobre 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Statistiques

    Informations forums :
    Inscription : Octobre 2020
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Effectivement, je ne comprenais pourquoi les fichiers s'écrasaient au fur et à mesure. Tout fonctionne correctement maintenant ! Merci beaucoup pour votre aide.
    Voici le code final :

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    /*------------------------------------------------------------------------------------------------------------*/
    /*  																										  */
    /*									PROGRAMME DE CONVERSION AU FORMAT CSV									  */
    /*  																										  */
    /*------------------------------------------------------------------------------------------------------------*/
     
    /* A faire : renseigner les chemins des tables en entrée et la destination des fichiers convertis (libor et libdes)
    et modifier le chemin des tables d'origine dans le filename "listfich" */ 
     
     
    	/* Dossier où sont stockées les tables en entrée */
     
    %let libor = ...\Tables;
     
    	/* Dossier de destination des fichiers convertis */
     
    %let libdes = ...\Out;
     
     
    /* On crée 2 bibliothèques SAS qui vont chercher les 2 chemins précédemment renseignés pour pouvoir ouvrir nos tables
    dans la session SAS et effectuer quelques contrôles */
     
    LIBNAME LIBTAB "&libor.";
    LIBNAME LIBOUT "&libdes.";
     
     
    /* Ici on liste les membres de la bibliothèque des fichiers d'origine à convertir (renseigner le même chemin que libor) */
     
    filename listfich pipe 'DIR ...\Tables /b';
     
     
    /* Puis on stocke le résultat, à savoir la liste des noms de fichiers à convertir dans LIBOUT.listfich */
     
    data LIBOUT.listfich;
        length nomfich $80;
        infile listfich truncover;
        input nomfich $80.;
    	%global nbr_fich;
        call symput ('nbr_fich',_n_);
    run;
     
     
    /* On va ensuite stocker dans une macro-variable mv&i les noms de tables stockés dans listfich  */
     
    data _null_ ;
         set LIBOUT.listfich;
    	 i + 1;
    	 output;
    	 call symput (compress("mv"||i),substr(compress(nomfich),1,length(nomfich)-9)) ;
    run;
     
     
    /* On réalise enfin la conversion des tables SAS en CSV (encodage UTF-8) du dossier d'origine vers le dossier de destination */
     
    %macro export;
    	%do i = 1 %to &nbr_fich;
    		filename fic_out "&libdes\&&mv&i...csv" encoding="utf-8";	
    		proc export data=LIBTAB.&&mv&i
    			outfile= fic_out
    			dbms = CSV replace;
    			delimiter = ";" ;
    			putnames=yes;
    		run;
    	%end ;
    run ;
    %mend export;
    %export
    Cordialement,

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

Discussions similaires

  1. [2008] Import de plusieurs CSV dans plusieurs tables
    Par Swiss_GaGGy dans le forum SSIS
    Réponses: 6
    Dernier message: 08/09/2012, 10h56
  2. Réponses: 20
    Dernier message: 30/08/2012, 15h15
  3. Import de plusieurs CSV dans plusieurs Tables
    Par nephen dans le forum Import/Export
    Réponses: 3
    Dernier message: 15/04/2010, 15h13
  4. Import fichier csv dans plusieurs tables
    Par Gbillou dans le forum VBA Access
    Réponses: 3
    Dernier message: 16/11/2009, 16h57
  5. Exportation de plusieurs tables SAS
    Par manoir dans le forum Macro
    Réponses: 4
    Dernier message: 07/05/2009, 18h30

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