SAS 用左括号重命名文件

问题描述 投票:0回答:1

我有大量 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;
sas macros file-rename quoting
1个回答
0
投票

在我看来,问题在于宏,而不是名称或重命名。不确定宏在此过程中添加了什么值。为什么不在数据步骤中直接发出重命名语句?

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"
);
© www.soinside.com 2019 - 2024. All rights reserved.