【问题标题】:Assign filenames through the loop in SAS通过 SAS 中的循环分配文件名
【发布时间】:2018-06-18 22:02:51
【问题描述】:

我有一个需要导入 SAS 的文件列表。我需要分配文件名,这样我就不会多次键入相同的行:

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

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

%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 inf_&I._&J. 'C:\Users\Main_&I.\final_complete_&I.&J.csv';

%end;
%end;

%mend;
%FILENAME(J_TO=2); */

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

任何帮助将不胜感激。

【问题讨论】:

  • 你想在这里做什么?您可以在一个步骤中读取多个文件,也可以将多个文件读取到多个数据集,但都不会使用上述方法。您不需要文件名引用,如果您想为每个文件创建一个,这是可行的。不过,我会使用数据步进函数,而不是打开代码方法。
  • 文件名引用是 8 个字符,你有一个宏变量列表,但只传入一个?
  • 您好 Reeza,感谢您的评论。所以我创建了 %macro import_main(inf,outdat) 来导入 csv 文件。起初,我认为我应该设置 infile 名称。这就是为什么我需要为每个 csv 文件创建一个文件名列表。
  • 不,只需将文件名直接传递给宏。您可以在此处使用数据步骤来调用宏,使用调用执行并使用 CATT 函数来构建您的字符串。
  • 我在下面为您提供了几个选项,但未经测试。如果它们不起作用并且您无法调试,请告诉我。这里还有另一种方法:github.com/statgeek/SAS-Tutorials/blob/master/…

标签: loops macros sas filenames


【解决方案1】:

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

问题列表:

  • 宏变量只能用双引号解析,不能用单引号解析
  • 宏调用 - 不要在宏定义中包含 &
  • FileRef 限制为 8 个字符
  • 不一定需要 FileRefs

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

【讨论】:

  • 你好 Reeza,非常感谢你的提示。我已经重新编写了我的代码。 Proc 导入在我的情况下不起作用,但您提供了惊人的提示。我的宏现在可以工作了。
  • 很高兴它有帮助:)。如果您使用的是数据步骤:communities.sas.com/t5/SAS-Communities-Library/…
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 2020-02-20
    相关资源
    最近更新 更多