2014-12-05 4 views
0

Мне интересно, можно ли написать макрос для чтения файла в разных папках.Как написать код sas для чтения файла в разных папках?

Как, например, у меня есть 100 папок и в каждой папке, у него есть другая папка, внутри подпапки. Он может содержать txt-файл, который I хотите читать с помощью SAS. Новая папка может быть создана для добавления нового файла.

Folder1 folder2 файл

A1 aa1 file1

A2 aa2 (nofile)

... .. ...

A100 AA100 file100

Folder2 находится в folder1 и файл сохраняется в папке2.

Благодаря

Чэнь Сюй

+2

1. делать все файлы имеют точно такую ​​же структуру 2. Является ли это в ОС Windows или Unix 3. Можно ли запускать системные команды через SAS на компьютере, то есть X команды или трубы? – Reeza

+3

Вам нужно привести более конкретный пример. Является ли «может содержать» (эффективно) случайным или узорчатым? Вы хотите прочитать все эти данные в ОДНОМ наборе данных или хотите прочитать их в 100 (или более) наборах данных? – Joe

+2

Если вы хотите изучить, как схожие проблемы были затронуты другими, вы можете посмотреть [здесь] (http://www.sascommunity.org/wiki/SAS_Filesystem_Toolbox) – SRSwift

ответ

1

Следующий макрос может сделать работу;

%macro procesFilesInRoot(rootFolder,fileExt,procesMacro); 
     %put "dir ""%unquote(&rootFolder)"" /s /b"; 

     filename pipeTree pipe "dir ""%unquote(&rootFolder)"" /s /b" lrecl=32767; 
     data fullNames; 
      infile pipeTree truncover; 
      input fullName $char1000.; 
       ext = upcase(scan(fullName,countw(fullName, '.'), '.')); 
      if ext = "%upcase(&fileExt)"; 
     run; 
     filename pipeTree clear; 

     title 'files found'; 
     proc print; 
     run; 

     proc sql noprint; 
      select count(*) into :nrFiles from fullNames; 
      %let nrFiles = &nrFiles; /** to strip the leading blanks **/ 
       %if &nrFiles %then %do; 
       select fullName into :fullName1-:fullName&nrfiles from fullNames; 
       %end; 
     quit; 

     %do fileNr = 1 %to &nrFiles.; 
      %&procesMacro(&&fullName&fileNr); 
     %end; 
    %mend; 

Перед использованием, вам нужно написать макрос, который обрабатывает один входной файл;

%macro import1file(fullName); 
     %let fileName = %scan(&fullName,%sysfunc(countw(&fullName, '\')), '\'); 
     %let fileExt = %scan(&fileName,%sysfunc(countw(&fullName, '.')), '.'); 
     %let dataName = %substr(&fileName,1, %length(&fileName)-%length(&fileExt)-1); 

     proc import datafile = "&fullName" out=&dataName; 
     run; 
    %mend; 

Затем вы можете использовать его следующим образом;

%procesFilesInRoot(D:\Horsten,txt,import1file); 
Смежные вопросы