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 Discussion :

Export en CSV de plusieurs tables SAS


Sujet :

SAS

  1. #1
    Candidat au Club
    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 éprouvé
    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
    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 éprouvé
    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
    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 éprouvé
    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
    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,

###raw>template_hook.ano_emploi###