英文:
SAS attach excel last modified date to imported table
问题
I was trying to import excel to sas grid and add the last modified timestamp for the file into the table.
参考 sas support,我能够检索到最后修改的时间。但我在将时间添加为新列到表中时遇到问题。
我得到了这个错误:
SYMBOLGEN: Macro Variable LASTMODIFIED resolves to 09May2023:16:33:19
NOTE: LINE generated by the macro variable "LASTMODIFIED"
282 09May2023:16:33:19
----------
22
76
ERROR 22-322: Syntax error, expecting one of the following: !, !!....
ERROR 76-322: Syntax error, statement will be ignored.
以下是我尝试的代码:
%macro FileAttribs(filename);
%local rc fid fidc ModifyDT;
%let rc=%sysfunc(filename(onefile,&filename));
%let fid=%sysfunc(fopen(&onefile));
%if &fid ne 0 %then %do;
%let ModifyDT=%sysfunc(finfo(&fid,Last Modified));
%let fidc=%sysfunc(fclose(&fid));
%let rc=%sysfunc(filename(onefile));
%put NOTE- Last modified &modifydt;
proc sql;
create table work.final as
select *, &modifydt. as lastmodified
from work.tb; --从Excel导入的表
%end;
%else %put &filename could not be open.;
%mend FileAttribs;
也尝试将变量转换为不同的数据类型,但也失败了。
英文:
I was trying to import excel to sas grid and add the last modified timestamp for the file into the table.
Referred to the sas support I was able to retrieve the last modified time. But I am having trouble with add the time as a new column into the table.
I got this error:
SYMBOLGEN: Macro Variable LASTMODIFIED resolves to 09May2023:16:33:19
NOTE: LINE generated by the macro variable "LASTMODIFIED"
282 09May2023:16:33:19
----------
22
76
ERROR 22-322: Syntax error, expecting one of the following: !, !!....
ERROR 76-322: Syntax error, statement will be ignored.
Here is the code I tried:
%macro FileAttribs(filename);
%local rc fid fidc ModifyDT;
%let rc=%sysfunc(filename(onefile,&filename));
%let fid=%sysfunc(fopen(&onefile));
%if &fid ne 0 %then %do;
%let ModifyDT=%sysfunc(finfo(&fid,Last Modified));
%let fidc=%sysfunc(fclose(&fid));
%let rc=%sysfunc(filename(onefile));
%put NOTE- Last modified &modifydt;
proc sql;
create table work.final as
select *, &modifydt. as lastmodified
from work.tb; --the imported table from excel
%end;
%else %put &filename could not be open.;
%mend FileAttribs;
Also tried to cast the variable to different datatype but also failed.
答案1
得分: 1
The macro variable is a text string which confuses SQL. Add double quotes and the letters DT to tell SAS you want this to be interpreted as a datetime. Double quotes are for the macro variable to resolve. More information on date constants can be found here.
"&modifydt."dt as lastmodified format=datetime20.
英文:
The macro variable is a text string which confuses SQL. Add double quotes and the letters DT to tell SAS you want this to be interpreted as a datetime. Double quotes are for the macro variable to resolve. More information on date constants can be found here.
"&modifydt."dt as lastmodified format=datetime20.
答案2
得分: 0
这段代码中,有一些宏变量和SAS函数的使用。以下是已翻译的部分:
为什么要将值放入宏变量中,如果你需要在数据集中使用它的话?而不是使用 %SYSFUNC(),这样你就可以直接在数据步骤中调用 SAS 函数。
%macro FileAttribs(filename);
%local found;
%let found=0;
filename onefile "&filename" ;
data lastmodified;
fid = fopen('onefile');
if fid then do;
lastmodified = input(finfo(fid,'Last Modified'),datetime19.);
call symputx('found','1');
put 'NOTE: FILENAME=' "&filename" lastmodified= ;
fid=fclose(fid);
end;
else put 'WARNING: FILENAME=' "&filename" ' not found.';
format lastmodified datetime19.;
drop fid ;
run;
filename onefile ;
%if &found %then %do;
data work.final;
set work.tb ;
if _n_=1 then set lastmodified;
run;
%end;
%mend FileAttribs;
请注意,我已经将代码中的 HTML 转义字符还原为正常的字符。
英文:
Why did you go to all the trouble to put the value into a macro variable if you needed it in a dataset? Instead of using %SYSFUNC() so you can call SAS functions with macro code just use a data step so you can call the functions directly.
%macro FileAttribs(filename);
%local found;
%let found=0;
filename onefile "&filename" ;
data lastmodified;
fid = fopen('onefile');
if fid then do;
lastmodified = input(finfo(fid,'Last Modified'),datetime19.);
call symputx('found','1');
put 'NOTE: FILENAME=' "'&filename'" lastmodified= ;
fid=fclose(fid);
end;
else put 'WARNING: FILENAME=' "'&filename'" ' not found.';
format lastmodified datetime19.;
drop fid ;
run;
filename onefile ;
%if &found %then %do;
data work.final;
set work.tb ;
if _n_=1 then set lastmodified;
run;
%end;
%mend FileAttribs;
Note: This code will only work on Unix as the FINFO() function on Windows is not able to get the 'Last Modified' metadata about a file.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论