2017-10-13 5 views
0

Sujet: SAS BibliothèqueDéfinition d'une bibliothèque SAS où une partie du nom du dossier sera changer chaque fois (Lorsque cette macro série SAS de différents utilisateurs)

Difficulté: Chemin (Nom et emplacement du fichier) est changer après chaque course, mais seulement certains des détails changent mais pas le chemin complet (comme indiqué dans l'exemple ci-dessous). Nous avons également mis en évidence ces zones en gras

Je veux écrire un seul code où je peux couvrir tout type de changement qui se passe dans le nom et l'emplacement du fichier, est-ce possible?

%let path='C:\Data\variationstring\empcat**A**\person**34**_**1212**\persondata_empcatA_**34**';  
libname test "&path"; 
proc import datafile="&path\Accounts_**34**.xls" 
    out=mydata 
    sheet="thefile"; 
    getnames=no; 
run; 

Lorsqu'un autre utilisateur d'exécuter ce programme puis au-dessus chemin sera modifié:

%let path='C:\Data\variationstring\empcat**A**\person**49**_**1684**\persondata_empcatA_**49**';  
libname test "&path"; 
proc import datafile="&path\Accouns_**49**.xls" 
    out=mydata 
    sheet="thefile"; 
    getnames=no; 
run; 

Quelqu'un peut-il me aider pour cela, s'il vous plaît?

Merci

+0

Veuillez être plus précis dans votre question et fournir plus d'informations. À quoi se réfèrent les chiffres ('34',' 49', '1212', etc.)? Sont-ils censés être résolus dynamiquement en fonction de l'utilisateur qui exécute le code? – user2877959

+0

Gras ne fonctionne pas dans le formatage de code, fyi ... – Joe

+0

Vous pouvez également utiliser la fonction LIBNAME dans un DATA STEP où il est plus facile de manipuler des chaînes. – Reeza

Répondre

1

Essayez de le mettre dans une macro comme ceci:

%macro import (macro_var1,macro_var2,macro_var3); 
%let path="C:\Data\variationstring\empcat**A**\person**&macro_var1.**_**&macro_var2.**\persondata_empcatA_**&macro_var3.**";  
libname test "&path"; 
proc import datafile="&path\Accouns_**49**.xls" 
    out=mydata 
    sheet="thefile"; 
    getnames=no; 
run; 
%mend; 
%import (34, 1212, 34); 
%imoprt (49, 1684, 49); 
etc. 

lorsque le chemin définissant, ne pas oublier de le mettre entre guillemets (") insted de simple (')

+0

Vous voudrez probablement ajouter également '& macro_Var1.' au nom de fichier' proc import'. Et je suppose que le troisième paramètre de macro n'est pas nécessaire, c'est juste '& macro_var1' répété. – Joe

+0

En fait, vous avez besoin d'une troisième variable, mais c'est pour le 'empcat' (le' ** A ** '). – Joe

1

en plus d'une excellente suggestion de Grigory, il me semble que vous faites quelque chose qui serait bien servi en utilisant une approche de programmation axée sur les données.

Si vous avez, dites , une feuille de calcul Excel avec tous vos dossiers du personnel - disons que le premier numéro est store et le second est employeeID - et que vous voulez exécuter un rapport par employeeID, alors vous écrivez la macro comme Grigory suggéré; mais vous appelez le rapport du premier ensemble de données.

Voici:

proc import file="C:\Data\employeeID.xlsx" 
      out=employees dbms=xlsx 
      replace; 
run; 

%macro get_employee(store=, employeeID=, empCat=); 
%let path="C:\Data\variationstring\empcat&empcat.\person&store._&employeeID.\persondata_empcat&empcat._&store.";  
libname test "&path"; 
proc import datafile="&path\Accouns_&store..xls" 
    out=mydata 
    sheet="thefile"; 
    getnames=no; 
run; 
%mend get_employee; 

proc sql; *this generates macro calls, look at output to see what the macro variable contains; 
    select cats('%get_employee(employeeid=',employeeID,',store=',store,',empcat=',empcat,')') 
    into :get_emp_list separated by ' ' 
    from employees; 
quit; 

&get_emp_list.; *This actually runs all those macro calls; 

Vous pouvez lire mon papier, Writing Code With Your Data pour plus de détails, ou de trouver d'autres documents similaires en ligne.