我有大量 Excel 文件需要处理。我创建了将它们的名称读取到数据集中以执行每个文件的代码。不幸的是,每个文件都有一个左括号,如“(”,例如:Jason (Allen.xlsx
我已经编写了代码来清理列表数据集中的名称,但我似乎无法让基于 RENAME 的宏与左括号一起使用。使用两个虚拟 Excel 文件,school_file_list 数据集中的第一条记录将很好地更改名称,因为它有右括号......但第二个文件名不会更改。有没有办法编辑我的宏以向其提供带有违规左括号的文件名?
data school_file_list;
input fname $ 1-18 newfname $ 20-42;
cards;
Jason (Allen).xlsx Jason Allen.xlsx
Jason (A.xlsx Jason A.xlsx
;
run;
%let filepath= %nrbquote(C:\mypath\);
%macro file_rename(from, to);
data _null_;
rc=rename("&filepath.&from", "&filepath.&to", "file");
if rc ne 0 then do;
put "Rename of file &from to &to DID NOT WORK!!!" rc=;
call symput('err','1');
end;
else put "Rename of file &from to &to WORKED.";
run;
%mend file_rename;
data _null_; set school_file_list;
call execute ('%file_rename(from='||strip(fname)||', to='||strip(newfname)||');');
run;
在我看来,问题在于宏,而不是名称或重命名。不确定宏在此过程中添加了什么值。为什么不在数据步骤中直接发出重命名语句?
data _null_;
set school_file_list;
rc=rename(cats("&filepath",fname),cats("&filepath",newfname),"file");
...
如果您需要创建一个宏,请创建一个以数据集名称作为输入的宏。
类似这样的:
%macro file_rename(dsname,from=from,to=to,filepath=" ");
data _null_;
set &dsname;
rc=rename(cats(&filepath,&from),cats(&filepath,&to),"file");
if rc ne 0 then do;
put "Rename of file " &from "to " &to "in " &filepath "DID NOT WORK!!!" rc=;
call symput('err','1');
end;
else put "Rename of file " &from "to " &to "in " &filepath "WORKED.";
run;
%mend file_rename;
对于您的示例数据集和根路径,您可以这样调用:
%file_rename
(dsname=school_file_list
,from=fname
,to=newfname
,filepath="&filepath"
);
这将生成如下代码:
894 %let filepath=c:\;
895 %file_rename(dsname=school_file_list,from=fname,to=newfname,filepath="&filepath");
MPRINT(FILE_RENAME): data _null_;
MPRINT(FILE_RENAME): set school_file_list;
MPRINT(FILE_RENAME): rc=rename(cats("c:\",fname),cats("c:\",newfname),"file");
MPRINT(FILE_RENAME): if rc ne 0 then do;
MPRINT(FILE_RENAME): put "Rename of file " fname "to " newfname "in " "c:\" "DID NOT WORK!!!" rc=;
MPRINT(FILE_RENAME): call symput('err','1');
MPRINT(FILE_RENAME): end;
MPRINT(FILE_RENAME): else put "Rename of file " fname "to " newfname "in " "c:\" "WORKED.";
MPRINT(FILE_RENAME): run;
稍作改动
%if %length(&dsname) %then %do;
set &dsname;
%end;
您也可以在没有数据集的情况下使宏工作。
%file_rename
(from='Jason (Allen).xlsx'
,to='Jason Allen.xlsx'
,filepath="&filepath"
);