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 :

Macros sas pour traiter une liste de fichiers d’un même répertoire


Sujet :

Macro

  1. #1
    Membre du Club
    Homme Profil pro
    Helsinki
    Inscrit en
    Avril 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Finlande

    Informations professionnelles :
    Activité : Helsinki
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 39
    Points : 64
    Points
    64
    Par défaut Macros sas pour traiter une liste de fichiers d’un même répertoire
    Bonjour à tout le monde,
    Je suis à la recherche de conseils et suggestions concernant la possibilité d’automatiser une analyse sas (ensemble d’étapes DATA) en l’appliquant à un nombre important de fichiers
    Voilà ce que je voudrai faire :
    - analyser un nombre important de fichiers de données (fichier1, fichier2, fichier3 … fichiern) de format texte, tous ayant la même structure et localisés dans un même répertoire
    - à chaque passage d’un fichier, le résultat (seulement certaines variables) est récupéré et stocké dans un fichier texte (resultat)
    - à la fin du passage de tous les fichiers de données, le fichier « resultat », sera alors la synthèse de l’analyse de tous les fichiers

    Ci-après un exemple d’un petit bout de code d’un ensemble plus grand que j’avais l’habitude d’utilise. Cela ne causait pas de problèmes car j’avais toujours un nombre de fichiers limités à traiter, donc je pouvais les passer un à un manuellement. À présent c’est devenu plus corsé car je dois faire rouler avec le même programme plein de fichier.

    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
     
    Filename Donnees1 ('C:\MonDossier\Donnees1.txt'); 
    data donnees1;
    infile donnees1 LS=300;
    input id_nom $ 1-11	nom $ 12-17 var1 18-19 var2 $ 20-24 var3 $ 25-26 var4 $ 27-30 var5 $ 31-32 var6 33-37 var7 38-41@;
    run;
     
    data donnees2;
    set donnees1;
    	A1= 0;
    	if var3 = "" then do;
    	var3 = 1;
    	A1= var3; 
    	end;
    		else do;
    		A1= 10*exp(var3);
    		end;
    run;
     
    data donnees3;
    set donnees2;
    	if A1 = "" then do;
    	B1= var4*var5-var7;
    	end;
    		else do;
    		B1= var4*var4;
    		end;
    run;
    Merci d’avance pour votre aide.

  2. #2
    Membre actif
    Homme Profil pro
    Analyste - Information médicale
    Inscrit en
    Mars 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste - Information médicale
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2012
    Messages : 72
    Points : 255
    Points
    255
    Par défaut
    Hello Americano,

    ALors je teb donne quelques bouts de programme à combiner ensuite :

    1 - récupérer l'ensemble des fichiers d'un dossier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    data fichiers (keep=fichiers);
    length fichiers $256;
    	fich=filename('fich',"C:\MonDossier\");
    	/* ouverture du répertoire */
    	did=dopen('fich');
    	/* comptage du nb de fichier */
    	nb_fich=dnum(did);
    	do i=1 TO nb_fich;
    		fichiers=dread(did,i);
    		output;
    	end;
    	/* fermeture du répertoire */
    	rc=dclose(did);
    run;
    2 - Mettre dans des macros-variables (fic_1 à fic_n) les noms de fichiers

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    data_null_; SET fichiers;
    * Le nom des fichiers;
    call symput('fic_'||left(trim(_n_)),fichiers);
    * Le nombre de fichiers;
    call symput('nb',_n_);
    run;
    3 - Faire une boucle avec les opérations sur tes fichiers

    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
     
    %macro operation();
     
    %do i=1 %to &nb.;
     
    * Pour appeler un fichier, faire "&&fic_&i.";
     
    filename donnees&i. ('C:\MonDossier\&&fic_&i.'); 
    data donnees&i.;
    infile donnees1 LS=300;
    input id_nom $ 1-11 nom $ 12-17 var1 18-19 var2 $ 20-24 var3 $ 25-26 var4 $ 27-30 var5 $ 31-32 var6 33-37 var7 38-41@;
    run;
     
    ...
     
    %end;
     
    %mend;
    N'hésites pas si je n'ai pas été clair !
    Bon codage !

  3. #3
    Membre du Club
    Homme Profil pro
    Helsinki
    Inscrit en
    Avril 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Finlande

    Informations professionnelles :
    Activité : Helsinki
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 39
    Points : 64
    Points
    64
    Par défaut
    Bonjour Fabien et merci pour ton aide,
    Pour ce qui est des 3 étapes que tu as proposées, voilà ce que j’ai obtenu :
    Etape 1 : j’ai effectivement pu récupérer l'ensemble des fichiers du dossier (donc réglé)
    Etape 2 : aucun message d’erreur n’est renvoyé dans le log donc les noms de fichiers (fic_1 à fic_n) ont été mis dans des macros-variables (donc réglé)
    Etape 2 : C’est là que j’ai des soucis, il roule correctement car le log ne me renvoi aucun message d’erreur. Toutefois, je m’attendais à avoir un fichier output qui comporterait le résultat des tests successifs appliquée par la boucle à (fic_1 à fic_n). En d’autres termes est-il possible de créer un fichier (fichier_resultat.txt) qui va se comporter comme suit :
    1- Si fic_1 passe dans la boucle macro, il renvoi un résultat qui est stocké dans fichier_resultat.txt, ensuite
    2- Si fic_1 passe à son tour dans la boucle macro, son résultat est également stocké fichier_resultat.txt, juste en dessous des résultats de fic_1
    3- Et ainsi de suite jusqu’à fic_n
    Donc fichier_resultat (.txt) sera stocké dans le même dossier de travail et aura la structure suivante (dans ce tableau fic_1, fic_2… fic_n renvoient les résultats des fichiers correspondants et comportent autant de lignes que le fichier de départ) :

    Var1 Var2 Var3 Var4 Var5 . . .
    fic_1 fic_1 fic_1 fic_1 fic_1 . . .
    fic_1 fic_1 fic_1 fic_1 fic_1 . . .
    fic_1 fic_1 fic_1 fic_1 fic_1 . . .
    .
    .
    .
    fic_2 fic_2 fic_2 fic_2 fic_2 . . .
    fic_2 fic_2 fic_2 fic_2 fic_2 . . .
    fic_2 fic_2 fic_2 fic_2 fic_2 . . .
    .
    .
    .
    fic_n fic_n fic_n fic_n fic_n . . .

    Remarque: Dans fichier_resultat.txt est-il possible de limiter l'exportation des résultst à uniquement (var1, var2, et var5) et non à la totalité (var1...varn) pour limiter la taille du fichier de sorti?
    Merci encore pour tout pour ton aide.

  4. #4
    Membre actif
    Homme Profil pro
    Analyste - Information médicale
    Inscrit en
    Mars 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste - Information médicale
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2012
    Messages : 72
    Points : 255
    Points
    255
    Par défaut
    Oui c'est faisable très simplement :
    - première boucle : tu enregistres ta table ("donnees" je crois dans ton exemple) dans une table "resultats"
    - les boucles suivantes : tu ajoutes à ta table resultat par set
    donc à peu prè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
     
    %macro operation();
    %do i =1 %to &nb.;
     
    ...
    etapes pour creer la table "donnees&i."
    ...
     
    %if &i.=1 %then %do;
    data resultats; set donnees&i.; run;
    %end; %else %do;
    data resultats; set resultats donnees&i.; run;
    %end;
     
    %end;
    %mend;
    et pour conserver que les varaibels qui t'intéressent, tu utilises un keep:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    data resultats (keep=fichiers var1 var2...); set resultats donnees&i.; run;

  5. #5
    Membre du Club
    Homme Profil pro
    Helsinki
    Inscrit en
    Avril 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Finlande

    Informations professionnelles :
    Activité : Helsinki
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 39
    Points : 64
    Points
    64
    Par défaut Toujours sans solution
    Bonjour Fabien,
    J'ai tenté de comprendre la logique de ta macro et j'y suis parvenu. Malgré tout, je n'ai pas réussi à avoir le fichier [resultat] qui stocke les résultats de l'analyse des 5 fichiers que j'ai pris comme exemple. Un récapitulatif global du code:

    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
    /*1 - récupérer l'ensemble des fichiers d'un dossier*/
    DATA fichiers (keep=fichiers);
    length fichiers $256;
    	fich=filename('fich','C:\MonDossier\');
    	/* ouverture du répertoire */
    	did=dopen('fich');
    	/* comptage du nb de fichier */
    	nb_fich=dnum(did);
    	do i=1 TO nb_fich;
    		fichiers=dread(did,i);
    		output;
    	end;
    	/* fermeture du répertoire */
    	rc=dclose(did);
    run;
    %PUT _user_;
     
    /*2 - Mettre dans des macros-variables (fic_1 à fic_n) les noms de fichiers*/
    data _null_; SET fichiers;
    * Le nom des fichiers;
    call symput('fic_'||LEFT(trim(_n_)),fichiers);
    * Le nombre de fichiers;
    call symput('nb',_n_);
    run;
     
    /*3 - Faire une boucle avec les opérations sur tes fichiers*/
    %macro operation();
    %do i=1 %TO &nb.;
    * Pour appeler un fichier, faire "&&fic_&i.";
    filename fichiers&i. ('C:\MonDossier\&&fic_&i.'); 
     
    *début de mes étapes data, 2 en tout;
    DATA fichiers&i.;
    infile fichiers1 LS=300;
    input var1 $ 1-2 var2 $ 3-4 var3 $ 5-6 var4 $  7-8 var5 $ 9-10@;
    run;
     
    data donnees2;
    set fichiers1;
        A= var1*var2;
    run;
     
    data donnees3;
    set donnees2;
      B=A+var2;
    run;
    *fin de mes étapes data;
     
    %IF &i.=1 %then %do;
    DATA resultats; SET donnees&i.; run;
    %end; %else %do;
    DATA resultats; SET resultats donnees&i.; run;
    %end;
    %end;
    %mend;
    Voilà ce que j’obtiens pour l’étape 1, c’est exact comme sorti car la sortie me liste effectivement mes 5 fichier exemple qui sont dans MonDossier :

    fichiers
    fichiers1.txt
    fichiers2.txt
    fichiers3.txt
    fichiers4.txt
    fichiers5.txt
    Pour ce qui est de l’étape 2, un PUT _user_ me donne ce qui suit (c’est également exact) :

    %PUT _user_;
    GLOBAL FIC_4 fichier4.txt
    GLOBAL NB 5
    GLOBAL FIC_5 fichier5.txt
    GLOBAL FIC_2 fichier2.txt
    GLOBAL FIC_3 fichier3.txt
    GLOBAL FIC_1 fichier1.txt
    Pour l’étape 3, j’ai fait plusieurs tests, j’ai fait des adaptations à partir du programme initial que tu m’as transmis. Malgré cela, je n’ai pas pu créer le fichier de sortie [resultats.txt]. Il y a alors quelque chose dans l’étape 3, au moment où j’intègre mes étapes DATA, que je ne saisis pas. Tu remarqueras que j’ai allégé le code de mes étapes DATA en y mettant uniquement un exemple théorique. Pour le moment, ce qui me tracasse est l’obtention du fichier [resultats.txt]. Pourrais-tu jeter un coup d'oeil au code pour m'aider à voir où se situe le problème. Merci d'avance.

  6. #6
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Bonjour,
    Je n'ai pas trop compris ce que tu veux en faire de ton fichier resultat. Mais si tu veux faire un SET de tout tes fichiers, voici comment il faut procéder:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    %MACRO M;
    %DO i=1 %TO &NB.;
     
    /* tu peux rajouter tes if*/;
    DATA fichier_resultat ; SET %DO i=1 %TO &nb.; &&fic_&i. %end;; RUN;
    %END;
    %MEND;
    %M;
    Si jamais tu n'y arrives, poste ton code sans l'automatisation afin qu'on puisse bien comprendre ce que tu veux automatiser.

  7. #7
    Membre du Club
    Homme Profil pro
    Helsinki
    Inscrit en
    Avril 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Finlande

    Informations professionnelles :
    Activité : Helsinki
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 39
    Points : 64
    Points
    64
    Par défaut
    Bonjour,
    C’est vrai qu’en me relisant, je me suis rendu compte qu’il y avait certaines de mes demandes qui étaient plus ou moins flous.
    Ainsi, voici mon programme sas, c’est un exemple théorique sans macro qui correspond à ce que je voudrai faire. Remarquez que c’est « fichier1.txt » qui contient les données à analyser. Vous remarquerez qu’il y a 3 étapes DATA dont chacune utilise les résultats de l’étape DATA précédente :

    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
    filename donnees1 ("C:\MonDossier\fichier1.txt");
    *Première étape DATA;
    DATA donnees1;
    infile donnees1 LS=300;
    input var1 $ 1-2 var2 $ 3-4 var3 $ 5-6 var4 $  7-8 var5 $ 9-10@;
    run;
     
    *Deuxième étape DATA;
    DATA donnees2;
    set donnees1;
        A= var1*var2;
    run;
     
    *Troisième étape DATA;
    DATA donnees3;
    set donnees2;
      B=A+var2;
    RUN;

    donnees1 (première étape DATA)
    var1 -var2 -var3 -var4 -var5
    1 ----2 -----3 ----4 -----2
    3 ----6 -----9 ----12 ----1
    4 ----8 -----12 ---1 -----6
    5 ----10 ----1 ----5 ----20
    donnees2 (deuxième étape DATA, ajout de « A » comme nouvelle information)
    var1 -var2 -var3 -var4 -var5---A
    1 ----2 -----3 ----4 -----2----2
    3 ----6 -----9 ----12 ----1---18
    4 ----8 -----12 ---1 -----6---32
    5 ----10 ----1 ----5 ----20---50
    donnees3 (troisième étape DATA, ajout de « B » comme nouvelle information)
    var1 -var2 -var3 -var4 -var5---A---B
    1 ----2 -----3 ----4 -----2----2----4
    3 ----6 -----9 ----12 ----1---18---24
    4 ----8 -----12 ---1 -----6---32---40
    5 ----10 ----1 ----5 ----20---50---60
    Ainsi, le tableau de résultats qui m’intéresse correspond à celui la dernière étape DATA soit (données3)
    Imaginez à présent que vous voulez appliquer la même procédure à fichier2.txt. fichier3.txt jusqu’à fichier1000.txt. Une dizaine de fichier, on les fait passer manuellement un à un sans problème, mais 1000 fichiers, ca demande une macro pour automatiser le tout.
    Remarque : j’ai mis dans MonDossier (fichier1.txt, fichier2.txt, fichier3.txt, fichier4.txt, fichier5.txt).
    En faisant passer tous les fichiers un à un dans l’analyse, j’obtiendrai alors 5 fichiers de sorties « donnees3 » (dernière étape DATA). Ensuite manuellement, je peux fusionner ces 5 fichiers sorties pour avoir un tableau final (c’est en fait ma dernière étape que j’appelle « resultat »). Faites pas attention à la similitude du contenu des différents tableaux car pour simplifier j'ai simplement dupliquer fichier1 pour construire fichier2 jusqu'à fichier5 :
    var1 -var2 -var3 -var4 -var5---A----B--(Resulat - Fichier1)
    1 ----2 -----3 ----4 -----2----2----4
    3 ----6 -----9 ----12 ----1---18---24
    4 ----8 -----12 ---1 -----6---32---40
    5 ----10 ----1 ----5 ----20---50---60
    var1 -var2 -var3 -var4 -var5---A----B--(Resulat - Fichier2)
    1 ----2 -----3 ----4 -----2----2----4
    3 ----6 -----9 ----12 ----1---18---24
    4 ----8 -----12 ---1 -----6---32---40
    5 ----10 ----1 ----5 ----20---50---60
    var1 -var2 -var3 -var4 -var5---A----B--(Resulat - Fichier3)
    1 ----2 -----3 ----4 -----2----2----4
    3 ----6 -----9 ----12 ----1---18---24
    4 ----8 -----12 ---1 -----6---32---40
    5 ----10 ----1 ----5 ----20---50---60
    var1 -var2 -var3 -var4 -var5---A----B--(Resulat - Fichier4)
    1 ----2 -----3 ----4 -----2----2----4
    3 ----6 -----9 ----12 ----1---18---24
    4 ----8 -----12 ---1 -----6---32---40
    5 ----10 ----1 ----5 ----20---50---60
    var1 -var2 -var3 -var4 -var5---A----B--(Resulat - Fichier5)
    1 ----2 -----3 ----4 -----2----2----4
    3 ----6 -----9 ----12 ----1---18---24
    4 ----8 -----12 ---1 -----6---32---40
    5 ----10 ----1 ----5 ----20---50---60
    À présent le même code sas avec la macro :
    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
    /*1 - récupérer l'ensemble des fichiers d'un dossier*/
    DATA fichiers (keep=fichiers);
    length fichiers $256;
    	fich=filename('fich','C:\MonDossier\');
    	/* ouverture du répertoire */
    	did=dopen('fich');
    	/* comptage du nb de fichier */
    	nb_fich=dnum(did);
    	do i=1 TO nb_fich;
    		fichiers=dread(did,i);
    		output;
    	end;
    	/* fermeture du répertoire */
    	rc=dclose(did);
    run;
    %PUT _user_;
     
    /*2 - Mettre dans des macros-variables (fic_1 à fic_n) les noms de fichiers*/
    data _null_; SET fichiers;
    * Le nom des fichiers;
    call symput('fic_'||LEFT(trim(_n_)),fichiers);
    * Le nombre de fichiers;
    call symput('nb',_n_);
    run;
     
    /*3 - Faire une boucle avec les opérations sur tes fichiers*/
    %macro operation();
    %do i=1 %TO &nb.;
    * Pour appeler un fichier, faire "&&fic_&i.";
    filename fichiers&i. ('C:\MonDossier\&&fic_&i.'); 
     
    *début de mes étapes data, 2 en tout;
    DATA fichiers&i.;
    infile fichiers1 LS=300;
    input var1 $ 1-2 var2 $ 3-4 var3 $ 5-6 var4 $  7-8 var5 $ 9-10@;
    run;
     
    data donnees2;
    set fichiers1;
        A= var1*var2;
    run;
     
    data donnees3;
    set donnees2;
      B=A+var2;
    run;
    *fin de mes étapes data;
     
    %IF &i.=1 %then %do;
    DATA resultats; SET donnees&i.; run;
    %end; %else %do;
    DATA resultats; SET resultats donnees&i.; run;
     
    %end;
     
     
    %end;
    %mend;
    Mon problème : le fichier « resultats » n’est pas produit par sas même si dans mon log, aucun message d’erreur n’est indiqué. Voilà en gros ce que je voudrai. Merci encore de votre aide.

  8. #8
    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
    S'il s'agit d'importer N fichiers plats ayant la même structure et de fusionner verticalement les N tables pour n'en n'avoir qu'une, il vaut mieux passer par ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data FINAL;
    infile "c:\temp\fic*.txt"   ;
    input a b i;
    run;
    Ce qui donne pour toi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DATA FINAL;
    INFILE 'C:\MonDossier\Donnees*.txt' LS=300;
    input id_nom $ 1-11 nom $ 12-17 var1 18-19 var2 $ 20-24 var3 $ 25-26 var4 $ 27-30 var5 $ 31-32 var6 33-37 var7 38-41@;
    run;
    Une fois rassemblés dans FINAL, les données peuvent être analysées avec un BY, certaines les variables supprimées etc.
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  9. #9
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Il faut concaténer tes fichiers en dehors de la première boucle, sinon ils ne seront pas connus. Par contre, je ne comprends pas tes IF. Teste le programme, et s'il y a des erreurs, poste la log car je n'ai pas testé.

    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
    /*1 - récupérer l'ensemble des fichiers d'un dossier*/
    DATA fichiers (keep=fichiers);
    length fichiers $256;
    	fich=filename('fich','C:\Users\Desktop\FIc');
    	did=dopen('fich');
    	nb_fich=dnum(did);
    	do i=1 TO nb_fich;
    		fichiers=dread(did,i);
    		output;
    	end;
    	rc=dclose(did);
    run;
    %PUT _user_;
     
    /*2 - Mettre dans des macros-variables (fic_1 à fic_n) les noms de fichiers*/
    data _null_; SET fichiers;
    call symput('fic_'||LEFT(trim(_n_)),fichiers);
    call symput('nb',_n_);
    run;
     
    %put _user_;
     
     
     
    /*3 - Faire une boucle avec les opérations sur tes fichiers*/
    %macro operation;
    %do i=1 %TO &nb.;
    filename fichiers&i. ('C:\Users\Desktop\FIc\&&fic_&i.');  
    DATA fichiers&i.;
    infile fichiers&i. LS=300;
    input NAME $ 1-6 SEXE $ 8-8 var3 $ 10-6 ;
    run;
     
    data donnees2&i.;
    set fichiers1&i.;
        A= var1*var2;
    run;
     
    data donnees3&i.;
    set donnees2&i.;
      B=A+var2;
    run;
     
    %END;
     
    DATA fichier_resultat ; SET %DO i=1 %TO &nb.; donnees3&i.. %END;; RUN;
    %MEND;
    %operation;

  10. #10
    Membre du Club
    Homme Profil pro
    Helsinki
    Inscrit en
    Avril 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Finlande

    Informations professionnelles :
    Activité : Helsinki
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 39
    Points : 64
    Points
    64
    Par défaut Problème résolu
    Rebonjour,
    Mon problème est réglé et j’obtiens ce que je désirais. Merci à Fabien G. qui ma mis sur le chemin depuis le début par apport à mon problème. Merci aussi à Brice et Stéphane pour leurs contributions additionnelles qui m’a permis d’y voir claire et de parvenir à mes fins. J’ai toutefois apporté quelques retouches au code car le répertoire c:\MonDossier n’était pas reconnu. Après des recherches, j’ai appris que le compilateur macro s’exécute avant le compilateur SAS, donc il fallait sortir l’appel de répertoire en dehors de la macro. Voilà, le problème est résolu et merci encore pour tout.

  11. #11
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Tu peux nous poster le code? ça pourrait toujours servir à d'autres...

  12. #12
    Membre du Club
    Homme Profil pro
    Helsinki
    Inscrit en
    Avril 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Finlande

    Informations professionnelles :
    Activité : Helsinki
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 39
    Points : 64
    Points
    64
    Par défaut
    Bonjour,
    Le voici le code:
    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
    /*1 - récupérer l'ensemble des fichiers d'un dossier*/
    DATA list_fich (keep=fichiers);
    length fichiers $256;
    	fich=filename('fich','C:\MonDossier');
    	did=dopen('fich');
    	nb_fich=dnum(did);
    	do i=1 to nb_fich;
    		fichiers=dread(did,i);
    		output;
    	end;
    	rc=dclose(did);
    run;
     
    /*2 - Mettre dans des macros-variables (fic_1 à fic_n) les noms de fichiers*/
    DATA _null_; SET list_fich;
    call symput('fic_'||LEFT(trim(_n_)),fichiers);
    call symput('nb',_n_);
    run;
    %put _user_;
     
    /*3 - Faire une boucle avec les opérations sur tes fichiers*/
    %macro IMPORT(dir=);
    %do i=1 %TO &nb.;
     
    DATA donnees&i.;
    INFILE "&dir.\*.txt" FILENAME = fich LS=600;
    input var1 $ 1-3 var2 $ 4-6 var3 $ 7-9 var4 $ 10-12 var5 $ 13-15@;
    run;
     
      /*Première étape data*/
    data etape1&i.;
    set donnees&i.;
    A=var1+var2;
    run;
      /*Deuxième étape data*/
    data etape2&i.;
    set etape1&i.;
    B=var2+var3;
    run;
    %END;
    /*Création de la table résultat*/
    DATA fichier_resultat ; SET %DO i=1 %TO &nb.; etape2&i. %END;; RUN;
     
    %MEND;
    %IMPORT(dir=C:\MonDossier);

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/01/2008, 16h07
  2. Réponses: 4
    Dernier message: 21/08/2007, 10h40
  3. Réponses: 0
    Dernier message: 01/08/2007, 12h12
  4. Réponses: 2
    Dernier message: 20/06/2007, 10h34
  5. Recheche commande AWK pour afficher une liste de fichiers
    Par Krispy dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 21/07/2006, 11h36

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