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 18/07/2008, 14h57   #1
Invité régulier
 
Inscription : juin 2008
Messages : 35
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 35
Points : 5
Points : 5
Par défaut [Macro] Importation mutiple Excel-SAS

Bonjour,

J'aimerai automatiser l'importation de plusieurs fichiers excel (excel 2002) dans SAS 9. J'ai essayé à partir d'une macro mais rien...
voici mon code incorrect:

Code :
1
2
3
4
5
6
7
8
%MACRO IMPORT(fichier=);
PROC IMPORT OUT=nom1
			DATAFILE="&fichier"
			DBMS=EXCEL REPLACE;
		SHEET="FEUIL1$";
		GETNAMES=YES;
RUN;
%MEND
le fait que la macro variable soit un chemin cela pose problème je crois.

P.S: pouvez-vous également m'expliquer le RSUBMIT svp

Merci
finetude est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2008, 15h06   #2
Membre confirmé
 
Inscription : avril 2008
Messages : 233
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : avril 2008
Messages : 233
Points : 216
Points : 216
1. Quel est le problème ? Qu'est-ce qui ne fonctionne pas ?
2. Fais attention, si tu veux importer plusieurs fichiers dans SAS il vaut mieux peut-être donner les noms différents aux tables résultat ?
3. rsubmit et endrsubmit sont deux instructions de SAS délimitant les blocs de code qui sera exécuter sur le serveur. Le code en dehors de ces instruction est exécuté sur le SAS local.
green_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2008, 15h08   #3
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 482
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 482
Points : 2 866
Points : 2 866
A part un point-virgule manquant après %MEND, ça m'a l'air d'être du code correct. Maintenant, est-ce qu'il fait vraiment ce qu'on veut ? Si tu as plusieurs fichiers à importer, tu lances plusieurs fois ta macro, et dans la table SAS créée (WORK.NOM1), tu n'as que le contenu du dernier classeur Excel (puisqu'on ne change jamais de table en sortie et qu'il y a l'option REPLACE).
Si je peux suggérer une amélioration, ce serait d'ajouter un paramètre qui soit le nom de la table en sortie.
Quant à avoir une macro-variable qui contient un chemin, pas de souci là-dessus en théorie.

Enfin, RSUBMIT est une instruction qui indique à SAS que le code qui suit (jusqu'à ENDRSUBMIT) ne doit pas être exécuté sur le PC, mais sur une session SAS distante, démarrée sur un serveur (avec l'instruction SIGNON, parfois cachée dans l'Autoexec de la session SAS).

Olivier
olivier.decourt est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2008, 15h14   #4
Invité régulier
 
Inscription : juin 2008
Messages : 35
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 35
Points : 5
Points : 5
pour le second paramètre je suis d'accord.
j'avais du mal noté quelque chose car maintenant ça fonctionne!
tant mieux!

merci
finetude est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2008, 15h15   #5
Invité régulier
 
Inscription : juin 2008
Messages : 35
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 35
Points : 5
Points : 5
par contre vous n'auriez pas d'autres solutions peut-être plus pratiques à me proposer?
Je veux en savoir un maximum sur SAS!

merci
finetude est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2008, 15h36   #6
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 482
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 482
Points : 2 866
Points : 2 866
Si tu es en version 9 de SAS, et que tu as plusieurs feuilles à importer (plutôt que plusieurs classeurs), tu peux faire un LIBNAME ... EXCEL vers le classeur.
Sinon, pour lire plusieurs classeurs, je ne vois rien de plus efficace que plusieurs proc Import. A la rigueur, on peut elles-mêmes les automatiser en collectant les noms de fichiers Excel dans un répertoire donné.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DATA work.fichiersExcel ;
	LENGTH fic $ 300;
	INFILE "c:\temp\*.xls" FILENAME = fic ;
	INPUT ;
	fichier = fic ;
RUN ;
PROC SORT DATA = work.fichiersExcel NODUPLICATE ;
	BY fichier ;
RUN ;
DATA _NULL_ ;
	SET work.fichiersExcel ;
	CALL SYMPUT (COMPRESS("fichier"!!_N_), fichier) ;
	CALL SYMPUT ("nbFichiers", _N_) ;
RUN ;
olivier.decourt est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2008, 15h43   #7
Invité régulier
 
Inscription : juin 2008
Messages : 35
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 35
Points : 5
Points : 5
Citation:
Envoyé par olivier.decourt Voir le message
Si tu es en version 9 de SAS, et que tu as plusieurs feuilles à importer (plutôt que plusieurs classeurs), tu peux faire un LIBNAME ... EXCEL vers le classeur.
Sinon, pour lire plusieurs classeurs, je ne vois rien de plus efficace que plusieurs proc Import. A la rigueur, on peut elles-mêmes les automatiser en collectant les noms de fichiers Excel dans un répertoire donné.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DATA work.fichiersExcel ;
	LENGTH fic $ 300;
	INFILE "c:\temp\*.xls" FILENAME = fic ;
	INPUT ;
	fichier = fic ;
RUN ;
PROC SORT DATA = work.fichiersExcel NODUPLICATE ;
	BY fichier ;
RUN ;
DATA _NULL_ ;
	SET work.fichiersExcel ;
	CALL SYMPUT (COMPRESS("fichier"!!_N_), fichier) ;
	CALL SYMPUT ("nbFichiers", _N_) ;
RUN ;

Excusez mon ignorance mais à quoi ser CALL SYMPUT et DATA _NULL_ ?
finetude est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2008, 15h59   #8
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 482
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 482
Points : 2 866
Points : 2 866
DATA _NULL_ sert à faire une étape Data sans créer de table en sortie. On l'utilise pour faire des exports de fichiers plats (avec les instructions FILE et PUT), et pour créer des macro-variables (avec cette instruction CALL SYMPUT).
CALL SYMPUT prend une valeur dans une variable SAS et crée une macro-variable ; la syntaxe est CALL SYMPUT( nomMacroVariable, nomVariableSAS ).
Cela permet de récupérer dynamiquement des valeurs pour que le programme s'adapte plus aisément aux données. Ici, l'idée serait au final de ne plus paramétrer que le répertoire.
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 importExcelMassif (rep) ;
	DATA work.fichiersExcel ;
	    LENGTH fic $ 300 nom $ 32 ;
	    INFILE "&rep\*.xls" FILENAME = fic ;
	    INPUT ;
	    fichier = fic ;
		nom = SCAN(fichier,-2,"./\") ;
	RUN ;
	PROC SORT DATA = work.fichiersExcel NODUPLICATE ;
	    BY fichier ;
	RUN ;
	DATA _NULL_ ;
		SET work.fichiersExcel ;
		CALL SYMPUT (COMPRESS("fic"!!_N_), LEFT(TRIM(fichier))) ;
		CALL SYMPUT (COMPRESS("nom"!!_N_), LEFT(TRIM(nom))) ;
		CALL SYMPUT ("nbFic", _N_) ;
	RUN ;
	%DO i=1 %TO &nbFic ;
		PROC IMPORT DATAFILE = "&&fic&i" OUT = work.&&nom&i
		            DBMS = EXCEL REPLACE ;
			GETNAMES = YES ;
		RUN ;
	%END ;
%MEND importExcelMassif ;
%importExcelMassif (c:\temp) ;
olivier.decourt est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2008, 16h00   #9
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 810
Points : 4 810
Bonjour,
LA FAQ SAS pourra t'aider:
FAQ SAS
Par exemple pour ta première question :
CALL SYMPUT
__________________
Les balises code
FAQ SAS
Rubrique SAS

Si vous souhaitez contribuer à la rubrique SAS, contactez-moi ou tout autre membre de l'équipe BI par MP.
fafabzh6 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 21h46.


 
 
 
 
Partenaires

Hébergement Web