2017-05-11 4 views
0

현재 모든 경로와 파일 이름이 포함 된 테이블을 기반으로 반복 된 infile 문을 사용하여 SAS에 몇 백 개의 파일을 가져옵니다. 지금 내가 원하는 것은 각 파일의 속성을 가져와 각 파일을 만든 사람의 사용자 이름을 가져 오는 것입니다. 나는 Finder를 사용하여 'Owner'변수를 얻으려고했지만이 변수가 올바른지 확실하지 않습니다. 제가 사용한 코드는 다음과 같습니다.SAS에서 파일을 가져올 때 소유자 이름 가져 오기

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; 

어떤 도움을 주시면 감사하겠습니다.

+1

어떤 OS를 사용하고 있습니까? 'finfo'의 동작은 OS 의존적입니다. – user667489

+0

죄송합니다 - 창문을 사용하고 있습니다 – Sherazon

답변

0

아래에 언급 된 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; 
+0

훌륭하게 작동합니다. 감사합니다! – Sherazon

+0

달콤한! 하나님 속도. – Hugs

0

사용자 환경의 파일에 대해 파일 소유자의 사용자 이름에 finfo 함수를 사용하여 액세스하지 못할 수 있습니다. 당신은 다음을 실행하여 파일에 사용할 수있는 항목의 이름을 나열 할 수 있습니다 : 그런 file owner 또는 뭔가 다음이 방법이 작동하지 않을 환경의 파일 목록에없는

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 명령을 파이프하여.

이 사용하여 파일 제어 기능의 예는 다음과 같습니다 당신이 정말로 촉각을 곤두 세우고있다 경우가 %sysfunc()의 모든 함수 호출을 래핑하여, 순수 매크로 코드에서 위의 모든 복제 할 수도 있습니다

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; 

.

+0

'dir/q' 배관 방법의 예는 어떻습니까? ;-) –

+1

@RobertPenridge Asker가 관심이있는 경우 예제를 제공 할 것입니다. 나는'option noxcmd'와 함께 살아야하기 때문에'finfo'를 사용하고있는 것이 가능하다는 것을 압니다. 어떤 경우에는 해결책이 없을 수도 있습니다. – user667489

+0

@ user667489 그 약간의 코드를 보내 주셔서 감사합니다. 사용하려고 시도했지만'finfo '를 사용하여 소유자 정보를 사용할 수 없다고 생각합니다. 'dir/q' 메소드의 예제를 제공해 주시겠습니까? 나는 여전히 cmd 명령을 사용할 수 있습니다. – Sherazon