Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
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 05/10/2011, 11h33   #1
Membre du Club
 
Inscription : novembre 2008
Messages : 69
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 69
Points : 41
Points : 41
Par défaut Importer des fichiers access vers sas automatiquement

Bonjour à tous,

j'ai plusieurs fichier en access (.mdb) qui sont dans un endroit bien précis et qui ont des noms different et je voulais voir s'il y a une methode plus avancées ou une macro pour faire un IMPORT automatique dés qu'il y a un nouveau fichier dans cet endroit:
Code :
1
2
3
4
5
6
7
8
9
10
 
 
PROC IMPORT OUT=  Best_01022011
            DATATABLE= "BestOfPhone" 
            DBMS=ACCESSCS REPLACE;
            DATABASE="\\test\input\Best_01022011.mdb"; 
     SERVER="XS0"; 
     PORT=1211; 
     SSPI=YES;
RUN;
merci d'avance
benvanbelgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 11h54   #2
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 009
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 009
Points : 1 709
Points : 1 709
hello,
je te propose une sollution mais il faut que tu modifies ton programme.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
libname rep Access "\\test\input\Best_01022011.mdb"
server="XSO" port =1211 ;
 
proc sql; 
 CREATE TABLE les_tables AS SELECT memname AS TABLES  FROM dictionary.TABLES WHERE Upcase(libname)='REP';
quit;
DATA _null_;
SET les_tables end=fin;
IF fin then call symput('nbr', _n_);
               call symput ('tabs'!! LEFT(_n_),TABLES);
run;
 
%macro import ;
 
  %do i=1%TO &nbr.;
         DATA &tabs&i;
                SET rep.&tabs&i.;
         run;
  %end;
%mend;
%import;
PS: je n'ai pas tester le code, à adapter si besoin.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 13h36   #3
Membre du Club
 
Inscription : novembre 2008
Messages : 69
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 69
Points : 41
Points : 41
Code :
1
2
 
libname rep Access "\\test\input\Best_01022011.mdb"
pas correct car la je dois juste lui spécifier l'endroit ou je trouve mes fichier access .mdb
alors je mets :
Code :
 libname rep Access "\\test\input
puis avec

Code :
1
2
3
proc sql; 
 CREATE TABLE les_tables AS SELECT memname  AS TABLES, libname     FROM dictionary.TABLES  WHERE Upcase(libname)='REP'  ;
quit;
Il trouve pas de fichier 0

pour etre précis:
j'ai dans ce lien \\test\input un ensemble de fichier access (file1.mdb file2.mdb ........ xor.mdb test.mdb) que je veux importer automatiquement
avce une macro ou une methode avancées.
benvanbelgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 14h26   #4
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 009
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 009
Points : 1 709
Points : 1 709
Bon OK,
si je comprends bien c'est les fichiers MDB que tu veux récupérer et non pas les tables.
Méthode1:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
   filename fic "\\test\input";
 
 
   DATA fic_mdb (keep = fichier ); 
      length FICHIER $50; 
      retain did ; 
      did = dopen("fic"); 
      IF did > 0 then do; 
         i = 1; 
         do while (dread(did,i) ne "" ) ; 
            FICHIER = dread(did,i); output;
            i = i+1 ; 
         end; 
         did = dclose(did); 
      end; 
   run;
Méthode2 :
Code :
1
2
3
4
5
6
7
8
9
10
 
 
OPTION noxwait;
filename cmd pipe "dir /b \\test\input";
 
   DATA tab;
   length fic $50.;
   INFILE cmd;
   input fic ;
   run;
maintenant t'as qu'à faire une boucle sur la table ,
t'as le choix entre un
ou récupérer les noms de tes fichiers dans des macros avec un
et faire une boucle par la suite.

il y a pas mal de sujet dans le forum sur le CALL SYMPUT.
j'espère pour toi que les noms de tes tables " à l'intérieur de tes bases Access ne varient pas" sinon tu sera obliger de mélanger cette sollution avec ce que je t'ai proposé au début " QUI N'EST PAS FAUX D 'AILLEURS"
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 14h33   #5
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 009
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 009
Points : 1 709
Points : 1 709
Important;
si dans tes répertoires, il y a d'autres fichiers qui ont d'autres extension , genre TXT,XLs, ...
tu rajoutes cette ligne à l'étape data :
Code :
1
2
 
IF UPCASE(scan(fichier,-1,'.'))='MDB';
pour ne garder que les fichier Access.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 16h04   #6
Membre du Club
 
Inscription : novembre 2008
Messages : 69
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 69
Points : 41
Points : 41
Merci pour votre response.

Pour ce qui est :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
libname user '\\Xs00\tables';
 
filename fic "\\Xs00\input\";
 
DATA fic_mdb (keep = fichier ); 
      length FICHIER $70; 
      retain did ; 
      did = dopen("fic"); 
      IF did > 0 then do; 
         i = 1; 
         do while (dread(did,i) ne "" )   ;  
            FICHIER = dread(did,i); output;
            i = i+1 ; 
         end; 
         did = dclose(did); 
      end;
 ; 
run;
jusqu'au là tout va bien je recoit une table dans mon user Fic_mdb avec tous les noms de fichier access avce extention .mdb qui se trouve dans mon lien.

avec
Code :
 call symput('nbr', _n_);
il me donne comme variable 78 qui le nbre de fichier access.

reste a trouver comment importer en faisant le lien avec les chaque nom dans la table fic_mdb.

expl
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
 
%macro import ;
%do i=1%TO &nbr.;
    PROC IMPORT OUT= nom du fichier access
            DATATABLE=   nom du fichier access
           DBMS=ACCESSCS REPLACE;
            DATABASE=" \\Xs00\input\nom fichier acess "; 
      SERVER="XS0"; 
      PORT=1211; 
      SSPI=YES;
    RUN;
 %end;
%mend;
benvanbelgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 16h16   #7
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 009
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 009
Points : 1 709
Points : 1 709
si les noms de tes tables Access sont les mêmes que les noms de tes bases Access;

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
32
33
34
35
36
37
38
 
%let chemin=\\Xs00\input\;
filename fic "&chemin";
 
DATA fic_mdb (keep = fichier ); 
      length FICHIER $70; 
      retain did ; 
      did = dopen("fic"); 
      IF did > 0 then do; 
         i = 1; 
         do while (dread(did,i) ne "" )   ;  
            FICHIER = dread(did,i); output;
            i = i+1 ; 
         end; 
         did = dclose(did); 
      end;
 ; 
run; 
 
DATA _null_;
SET fic_mdb  end=fin;
 IF fin then call symput ('nbr', _n_);
                call symput ('tab' !! LEFT(_n_), scan(scan(fichier,-1,'\'),1,'.));
run;
 
%macro import ;
%do i=1%TO &nbr.;
    PROC IMPORT OUT=&&tab&i.
            DATATABLE=   &&tab&i
           DBMS=ACCESSCS REPLACE;
            DATABASE=" %chemin.\%sysfunc(strip(&&tab&i...mdb)) "; 
      SERVER="XS0"; 
      PORT=1211; 
      SSPI=YES;
    RUN;
%end;
%mend;
%import;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 14h56   #8
Membre du Club
 
Inscription : novembre 2008
Messages : 69
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 69
Points : 41
Points : 41
Merci sam ca tres bien marché.

je dois juste mettre l'ensemble des table importer en une dans la meme macro ?


Merci pour tout
benvanbelgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 16h05   #9
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 009
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 009
Points : 1 709
Points : 1 709
Citation:
Envoyé par benvanbelgie Voir le message
je dois juste mettre l'ensemble des table importer en une dans la meme macro ?
Sorry,
mais je n'ai pas bien compris. Que veux tu faire au juste ?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 16h11   #10
Membre du Club
 
Inscription : novembre 2008
Messages : 69
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 69
Points : 41
Points : 41
ce que je veux c'est une fois l import est fait pout tout les fichiers. alors je met tout les fichiers en une table style:
Code :
1
2
3
4
 
DATA ALL ;
SET &&tab&i ......  ;
run;
benvanbelgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 16h17   #11
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 009
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 009
Points : 1 709
Points : 1 709
ah je comprends mieux :
donc ton code sera :
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
32
33
34
35
36
37
38
39
40
41
42
 
%let chemin=\\Xs00\input\;
filename fic "&chemin";
 
DATA fic_mdb (keep = fichier ); 
      length FICHIER $70; 
      retain did ; 
      did = dopen("fic"); 
      IF did > 0 then do; 
         i = 1; 
         do while (dread(did,i) ne "" )   ;  
            FICHIER = dread(did,i); output;
            i = i+1 ; 
         end; 
         did = dclose(did); 
      end;
 ; 
run; 
 
DATA _null_;
SET fic_mdb  end=fin;
 IF fin then call symput ('nbr', _n_);
                call symput ('tab' !! LEFT(_n_), scan(scan(fichier,-1,'\'),1,'.));
run;
 
%macro import ;
%do i=1%TO &nbr.;
    PROC IMPORT OUT=&&tab&i.
            DATATABLE=   &&tab&i
           DBMS=ACCESSCS REPLACE;
            DATABASE=" %chemin.\%sysfunc(strip(&&tab&i...mdb)) "; 
      SERVER="XS0"; 
      PORT=1211; 
      SSPI=YES;
    RUN;
%end;
%mend;
%import;
DATA finale;
SET 
%do i=1%TO &nbr.;&&tab&i %end;;
run;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 16h35   #12
Membre du Club
 
Inscription : novembre 2008
Messages : 69
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 69
Points : 41
Points : 41
Merci ca marche
benvanbelgie 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 21h07.


 
 
 
 
Partenaires

Hébergement Web