2016-03-24 7 views
0

いくつかのCSVデータセットでSAS 9.3を使用して分析しています。 SAS にあるファイルの読み込みを自動化して特定のディレクトリを見て、各ファイルを別々のデータセットに読み込むことを検討していました。データセットの変数番号が事前に不明なSAS DATA STEP

私はSASコーディングが新です。その点についていくつかの重要な点を無視すれば私を許してください。私が使用するつもりだ

コードはこのようなものです:

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; 

おかげであなたの助けのためにたくさん! このタスクを解決するためのアプローチを完全に編集してください。

アドバイスを受けた後、私は、コードを変更し、まだ動作していない...

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; 

しかし、それは動作しません!

+0

%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; 

その後、あなたがそれを呼び出すことができますか? – Reeza

答えて

1

PROC IMPORTをDATAFILEパラメータとOUTパラメータを持つマクロにします。次に、データFILE_LISTのCALL EXECUTEを使用して呼び出します。

+0

あなたのアドバイスありがとう!私はそれを行い、コードを公開します! – pm2r

0

これを試してください:あなたは、有効なSASシンタックスを生成するために、マクロ内で適切にパラメータ値を使用していない

/*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

。プロシージャに対するオプションの値の中で連結演算子(||)を使用することはできません。マクロ変数の値を適切な場所に展開して、生成されたコードがプロシージャの有効な構文になるようにします。また、物理ファイル名がSASデータセットに使用する有効な名前ではない状況を処理するために、別のパラメータをマクロに追加する必要があるかもしれません。たとえば、ファイル名はおそらく.csvで終わりますが、.csvをSASデータセットの名前に含めることは望ましくありません。平均正確に動作しないん何

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