Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/11/2010, 16h27   #1
Invité de passage
 
Harry Francois
Inscription : novembre 2010
Messages : 5
Détails du profil
Informations personnelles :
Nom : Harry Francois

Informations forums :
Inscription : novembre 2010
Messages : 5
Points : 1
Points : 1
Par défaut Tester l'existence d'un fichier et ensuite lire un fichier sas

Bonjour,

Je suis nouveau sur ce forum et j'aimerais avoir de l'aide pour vérifier l'exitence d'un fichier puis de le lire dans une étape DATA si il existe. Sinon de lire un autre fichier. J'ai écrit cette macro, mais elle ne semble pas marcher. POURQUOI.

Code :
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
 %let year = 10; 
 
%macro month(month=); 
 
DATA _NULL_;
     SET sashelp.vmember;
	IF libname="rms" AND memname="rmss0410" then do;
		call symputx("fname",rmss0410);
						end;
	else do;
		call symputx("fname",rmssADHC);
  	     end;
run;
 
DATA month_&month;
       SET rms.&fname;
	IF sampcode eq 1 then samp=totutct; else samp=0;
   	IF sampcode IN (1,2) then univ=totutct; else univ=0;
   	IF sampcode eq 1 then sampstr=1; else sampstr=0;
   	IF sampcode IN (1,2) then univstr=1; else univstr=0;
 
	   		month=&month;
			year=%eval(2000+&year);
 
keep month year samp sampstr metcode univ univstr dweltype inittycd totutct sampcode 	 provincd unitwt vunitto totutct recordid ;
 
run;
 
%mend month;
 
%month(month=10);
Clifabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2010, 09h54   #2
Membre éprouvé
 
Homme Rémi Bousquet
responsable adjoint service stat
Inscription : mars 2009
Messages : 334
Détails du profil
Informations personnelles :
Nom : Homme Rémi Bousquet
Âge : 35
Localisation : France

Informations professionnelles :
Activité : responsable adjoint service stat
Secteur : Finance

Informations forums :
Inscription : mars 2009
Messages : 334
Points : 464
Points : 464
Premier élément de réponse :

quand tu fais
Code :
call symputx("fname",rmss0410);
Alors SAS recherche la variable rmss0410, qui n'existe pas dans la table sashelp.vmember. C'est pourquoi tu as la valeur . pour ta macro variable fname.
Il faudrait donc que tu fasses plutôt :
Code :
call symputx("fname","rmss0410");
Mais je pense que la macro ne fera toujours pas ce que tu attends d'elle, je reviens plus tard avec une proposition
RemiBousquet est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/11/2010, 09h59   #3
Membre éprouvé
 
Homme Rémi Bousquet
responsable adjoint service stat
Inscription : mars 2009
Messages : 334
Détails du profil
Informations personnelles :
Nom : Homme Rémi Bousquet
Âge : 35
Localisation : France

Informations professionnelles :
Activité : responsable adjoint service stat
Secteur : Finance

Informations forums :
Inscription : mars 2009
Messages : 334
Points : 464
Points : 464
Voilà, j'ai retrouvé :
il y a la fonction exist : Verifies the existence of a SAS data library member

Pour l'intégrer dans ton code, tu peux procéder je pense comme suit :
Code :
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
%let year = 10; 

%macro month(month=); 

%if %sysfunc(exist(rms.rmss0410))
    %then %do ; %let fname = rmss0410 ; %end ; 
    %else %do ; %let fname = rmssADHC ; %end ;

data month_&month;
    set rms.&fname;
    if sampcode eq 1 then samp=totutct; else samp=0;
    if sampcode in (1,2) then univ=totutct; else univ=0;
    if sampcode eq 1 then sampstr=1; else sampstr=0;
    if sampcode in (1,2) then univstr=1; else univstr=0;

    month=&month;
    year=%eval(2000+&year);

    keep month year samp sampstr metcode univ univstr dweltype inittycd totutct sampcode provincd unitwt vunitto totutct recordid ;

run;

%mend month;

%month(month=10);
RemiBousquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 21h47   #4
Invité de passage
 
Harry Francois
Inscription : novembre 2010
Messages : 5
Détails du profil
Informations personnelles :
Nom : Harry Francois

Informations forums :
Inscription : novembre 2010
Messages : 5
Points : 1
Points : 1
Salut Rémi,

Merci pour ton aide. À part, ta première remarque concernant les guillemets (""), j'avais trouvé entre-temps ce qui ne marchait pas dans ma macro. Voici mes nouveaux codes qui fonctionnent.

Code :
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 month(month=); 
 
DATA _NULL_;
       SET sashelp.vmember(WHERE=(libname="RMS")) end=end1;
	 length mem $8 lib $3;
	          mem=substr(memname,1,8);
 	          lib=substr(libname,1,3);
	output;
	retain flag 0;
	       IF lib="RMS" AND mem="RMSS&month&year" then do;
		flag=1;
	        call symput("fname","RMSS&month&year");
	 output;
						      end;	
	IF end1 then do;
	     IF flag=0 then do;
		call symput("fname","rmssADHC");
		end; end; 
	run;
 
DATA month_&month;
      SET rms.&fname;
run;
 
%mend month;
%month(month=04);
Clifabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h13.


 
 
 
 
Partenaires

Hébergement Web