2016-03-24 53 views
0

Birkaç CSV veri kümesinde SAS 9.3 ile bazı analizler yapıyorum. SAS 'a söylenen dosyaların yüklenmesini otomatik olarak belirli bir dizine bakmak ve her bir dosyadaki veri kümesini ayırmak için yüklemek istedim.SAS VERİ ADIMI değişken sayıda veri kümesi bilinmeyen bir öntanımlı

SAS kodlama konusunda yeniyim, bu yüzden bazı önemli noktaları göz ardı edersem beni affet. Ben kullanacağım

kod bunun gibi:

filename filelist pipe 'dir "C:\my_path\*.csv" /b'; 

data file_list ; *** here I have the list of files to be read 
    length file_name $256 ; 
    infile filelist length=reclen ; 
    input file_name $varying256. reclen ; 
run; 

*** HERE I MISS HOW TO DYNAMICALLY LOAD A NUMBER OF FILES NOT KNOWN BEFORE; 

*** I should find a way to say: set file_list; 
proc import datafile="C:\my_path\"||file_name; *** I know that in this way doesn't work but It was just to show my idea of doing it. 
    out = file_name 
    dbms = csv 
    replace; 
    getnames = yes; 
run; 

Yardımlarınız için teşekkürler çok! Lütfen bu görevi çözmek için yaklaşımı tamamen düzenlemekten çekinmeyin.

bir tavsiye aldıktan sonra, kodu değiştirdim ama hala çalışmıyor

...

filename filelist pipe 'dir "C:\my_path\*.csv" /b'; 

data file_list ; *** here I have the list of files to be read 
    length file_name $256 ; 
    infile filelist length=reclen ; 
    input file_name $varying256. reclen ; 
run; 

%MACRO load_my_csv_file(name_file=); 

proc import datafile="C:\my_path\"||&name_file 
    out = &name_file 
    dbms = csv 
    replace; 
    getnames = yes; 
run; 
%MEND load_my_csv_file; 

data _NULL_ ; 
    set file_list; 
    call execute('%load_my_csv_file(name_file='||file_name||')'); 
run; 

Ama çalışmıyor!

+0

Ne çalışmıyor mu tam anlamı:

%MACRO load_my_csv_file(name_file=,dsname=); proc import datafile="C:\my_path\&name_file" out = &dsname dbms = csv replace ; getnames = yes; run; %MEND load_my_csv_file; 

Sonra birlikte diyebiliriz? – Reeza

cevap

1

PROC IMPORT'u DATAFILE ve OUT parametreleriyle bir makro haline getirin. Daha sonra FILE_LIST verilerinde CALL EXECUTE öğesini kullanarak arayın.

+0

Tavsiyeniz için teşekkürler! Bunu yapacağım ve kodu yayınlayacağım! – pm2r

0

bu deneyin: Geçerli SAS sözdizimi oluşturmak için makro içine düzgün parametre değeri kullanmayan

/*get the filepath of the folder you want to import from*/ 
%let folderpath = your_file_path; 
filename files pipe "%str(dir %"&folderpath.%" /B) " lrecl=5000; 

/*create a dataset containing the names of all the files in that directory*/ 
data list_of_files; 
    infile files truncover; 
    input file $255.; 
run; 

/*select those into a macro variable to loop through*/ 
proc sql noprint; 
    select distinct file into: files_to_import 
    separated by " " 
    from list_of_files; 
quit; 

/*loop through the macro variable and import all the files*/ 
%macro csv_importer; 

    %do i = 1 %to %sysfunc(countw(&files_to_import.)); 
    %let this_file = %scan(&files_to_import., &i., " "); 

     proc import datafile = "&folderpath.\&this_file." 
      out = dataset&i. 
      dbms = csv replace; 
      getnames = yes; 
     run; 

    %end; 

%mend csv_importer; 

%csv_importer; 
0

. Bir yordamın değerlerinin içindeki birleştirme işlecini (||) bir yordayamıyorsunuz. Bunun yerine makro değişkenin değerini uygun yere genişletin, böylece oluşturulan kod prosedür için geçerli sözdizimi olur. Ayrıca, fiziksel dosya adının bir SAS veri kümesi için kullanılacak geçerli bir ad olmadığı durumu işlemek için makronuza başka bir parametre eklemeniz gerektiğini de görebilirsiniz. Örneğin, dosya adlarınız muhtemelen .csv ile biter, ancak SAS veri kümesinin adına .csv'u eklemek istemezsiniz.

data _NULL_ ; 
    set file_list; 
    dsname = scan(file_name,-2,'./\'); 
    call execute(cats('%load_my_csv_file(name_file=',file_name,',dsname=',dsname,')')); 
run;