通过SAS中的循环分配文件名

时间:2018-06-18 22:02:51

标签: loops macros sas filenames

我有一个需要导入SAS的文件列表。我需要指定文件名,这样我就不会输入相同行的倍数:

constructor

我尝试编写%宏但它无法识别文件名:

filename inf_1_1 'C:\Users\Main_1\final_complete_1.1.csv';
filename inf_1_2 'C:\Users\Main_1\final_complete_1.2.csv';

我确信我做错了,需要从字符串变量中取出文件名。但我不知道该怎么做。

任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

请参阅下面的修改 - 基本上减少文件名字符串以导入数据。

问题清单:

  • 宏变量仅以双引号解析,而不是单引号
  • 微距通话 - 不包括&在宏定义中
  • FileRef限制为8个字符
  • 不一定需要FileRef

     %macro FILENAME (I_FROM=1, I_TO=I_FROM, J_FROM=1, J_TO=J_FROM);
    
     %local I J;
    
      %do I = &I_FROM %to &I_TO;
      %do J = &J_FROM %to &J_TO;
    
     filename i_&I._&J. "C:\Users\Main_&I.\final_complete_&I.&J..csv";
    
     proc import out=data_&i._&j. datafile=i_&i._&j. dbms=csv; run;
    
    %end;
    %end;
    
    %mend;
    %FILENAME(I_FROM=1, I_TO=10, J_FROM=1, J_TO=2); 
    

如上所述,您并不需要文件名参考。

%macro FILENAME (I_FROM=1, I_TO=I_FROM, J_FROM=1, J_TO=J_FROM);

 %local I J;

 %do I = &I_FROM %to &I_TO;
 %do J = &J_FROM %to &J_TO;


 proc import out=data_&i._&j. datafile="C:\Users\Main_&I.\final_complete_&I.&J..csv" dbms=csv; run;

%end;
%end;

%mend;
%FILENAME(I_FROM=1, I_TO=10, J_FROM=1, J_TO=2); 

最后但并非最不重要的一点是,你不需要这里的宏:

data _null_;
do i=1 to 2;
do j=1 to 2;
   *create filename;
   file_name = catt('C:\users_Main\Main_', i, '\final_complete_', i, '_', j, '.csv');
   *create output data set name;
   outdata = catt('data_', i, '_', j);
   *create command to import;
   str = catt('proc import out=', outdata, ' datafile=', filename, ' dbms=csv; run;');
call execute(str);
end;
end;
run;

答案 1 :(得分:0)

非常感谢您的提示。我写了以下宏:

 %macro Filename_loop (I_FROM=1, I_TO=&I_FROM, J_FROM=1, J_TO=&J_FROM);

 %local I J;

 %do I = &I_FROM %to &I_TO;
 %do J = &J_FROM %to &J_TO;

filename inf_&I._&J. "C:\Users\Main_&I.\final_complete_&I..&J..csv";


%end;
%end;

%mend;
%Filename_loop(J_TO=2);