2017-05-11 2 views
0

現在、すべてのパスとファイル名が含まれているテーブルに基づいて、ループされたinfileステートメントを使用してSASに数百ファイルをインポートしています。私が今やっているのは、各ファイルの属性をインポートして、各ファイルを作成したユーザーのユーザー名を取得することです。私はfinfoを使って '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

@RobertPenr​​idge質問者が興味がある場合の例を示します。私が知っている限り、彼らは 'option noxcmd'で生きなければならないので、彼らは' finfo'を使っている可能性があります。その場合、解決策がないかもしれません。 – user667489

+0

@ user667489このコードをお寄せいただきありがとうございます。私はそれを使用しようとしましたが、所有者情報が 'finfo'を使って利用できないとあなたは正しいと思います。 'dir/q'メソッドの例を提供してもらえますか?私はまだcmdコマンドを使用することができます。 – Sherazon

関連する問題