File 在SAS中导入文件时导入所有者的用户名
我目前正在使用一个基于包含所有感兴趣的路径和文件名的表的循环infle语句将几百个文件导入SAS。我现在要做的是导入每个文件的属性,以获取创建每个文件的用户的用户名。我一直在尝试使用finfo获取“Owner”变量,但不确定这是否是正确的。我一直在使用的代码看起来有点像这样:File 在SAS中导入文件时导入所有者的用户名,file,import,attributes,sas,File,Import,Attributes,Sas,我目前正在使用一个基于包含所有感兴趣的路径和文件名的表的循环infle语句将几百个文件导入SAS。我现在要做的是导入每个文件的属性,以获取创建每个文件的用户的用户名。我一直在尝试使用finfo获取“Owner”变量,但不确定这是否是正确的。我一直在使用的代码看起来有点像这样: filename fileref 'file.csv';
filename fileref 'file.csv';
data a(drop=fid);
infile fileref truncover obs=1;
fid=fopen('fileref');
fnum = foptnum(fid);
Bytes=finfo(fid,'File Size bytes)');
crdate=finfo(fid,'Create Time');
moddate=finfo(fid,'Last Modified');
owner=foptname(fid,2);
owner2 = finfo(fid,owner);
Owner1 = finfo(fid,'Owner');
run;
非常感谢您的帮助。对于您环境中的文件,可能无法通过
finfo
功能访问文件所有者的用户名。通过运行以下命令,可以列出文件可用项的名称:
data _null_;
fileref = "myfile";
rc = filename(fileref,"C:\temp\class.csv");
put rc=;
fid = fopen(fileref);
put fid=;
nopts = foptnum(fid);
do i = 1 to nopts;
optname = foptname(fid,i);
put optname=;
end;
rc = fclose(fid);
run;
如果环境中的文件没有列出文件所有者
或类似的内容,那么这种方法将不起作用。您需要以其他方式获取名称,例如,通过为相关文件使用dir/Q
命令
使用文件控制功能的示例如下:
data _null_;
fileref = "myfile";
/*
The line output by the command below will look something like this:
28/09/2016 13:29 437 user class.csv
*/
rc = filename(fileref,"dir /q c:\temp\class.csv | findstr class.csv",'pipe');
fid = fopen(fileref,'s');
rc = fread(fid);
length junk $100 username $32;
/*fget reads 1 word at a time, so throw away the 3 before the username*/
do i = 1 to 3;
rc = fget(fid, junk);
end;
rc = fget(fid, username);
rc = fclose(fid);
put _all_;
run;
如果您非常感兴趣,也可以在纯宏代码中复制上述所有内容,方法是将每个函数调用包装到
%sysfunc()
下面是使用前面提到的dir/q
方法的示例。在保留文件属性的同时读入文件夹中的多个文件应该很有用
%let target_dir = %str(C:\csv_files);
filename DrLst pipe "dir ""&target_dir.\*.csv"" /Q";
%let DELIM = ' ' ;
data readFiles;
length infile_path
filename $255
line $1024
owner $17
temp $16 ;
infile DrLSt length=reclen;
input line $varying1024. reclen;
/*For each csv file found, obtain the file information and read the file contents*/
if index(line,"<DIR>") eq 0 and substr(line,1,1) in('0','1') then do;
createDate = input( scan( line, 1, &DELIM ), mmddyy8. ) ;
createTime = input( scan( line, 2, &DELIM ), time10. ) ;
size = input( scan( line, 4, &DELIM ), best8.) ;
owner = scan( line, 5, &DELIM ) ;
/*Parsing the filename is tricky*/
filename = scan( line, 6, &DELIM ) ;
ndx = index( line, scan( filename, 1 )) ;
filename = substr( line, ndx ) ;
/*Now read in the found csv file*/
infile_path = cat("&target_dir.\",strip(filename));
infile temp filevar=infile_path dsd dlm=',' end=temp_end;
do until (temp_end);
input csvVar1 : $char50.
vscVar2 : $char50.;
output;
end;
end;
drop ndx line temp;
run;
%let target\u dir=%str(C:\csv\u文件);
文件名DrLst管道“dir”“&target\u dir.\*.csv”“/Q”;
%让DELIM='';
数据读取文件;
长度填充路径
文件名$255
第1024行
业主17元
临时工16美元;
填充DrLSt长度=重新连接;
输入行$varying1024。里肯;
/*对于找到的每个csv文件,获取文件信息并读取文件内容*/
如果('0','1')中的索引(线“”)等式0和substr(线,1,1),则执行;
createDate=输入(扫描(行、1和DELIM),mmddyy8);
createTime=输入(扫描(行、2和DELIM)、时间10);
大小=输入(扫描(第4行和第8行);
所有者=扫描(第5行和第5行);
/*解析文件名很棘手*/
文件名=扫描(第6行和第6行);
ndx=索引(行,扫描(文件名,1));
filename=substr(行,ndx);
/*现在读入找到的csv文件*/
infle\u path=cat(“&target\u dir.\”,strip(文件名));
infle temp filevar=infle_path dsd dlm=','end=temp_end;
直到(临时结束)为止;
输入csvVar1:$char50。
vscVar2:$char50。;
产出;
结束;
结束;
降低ndx线温度;
跑
您使用的是什么操作系统?finfo
的行为依赖于操作系统。抱歉-我使用的是Windows还有dir/q
管道方法的例子吗?;-)@罗伯特彭里奇如果提问者感兴趣,我将提供一个例子。据我所知,他们可能正在使用finfo
,因为他们必须使用选项noxcmd
,在这种情况下可能没有解决方案。@user667489感谢您的代码,我尝试过使用它,但我想您是对的,使用finfo
无法获得所有者信息。你能提供一个dir/q
方法的例子吗?我仍然可以使用cmd命令。太好了!天哪,速度太快了。