sasファイル名パイプで解決されないマクロの明白な呼び出し

Apparent invocation of macro not resolved in sas filename pipe


質問 written by pe-pe-rry @2019-01-25 04:29:54Z

: 0 : 2 : 134

次のSASコードを使用して、ディレクトリ&directory.下にあるすべてのファイルとそのサイズを検索しています&directory.

filename tmp pipe "find &directory. -type f -printf '%p %s\n'";
data all_files;
  infile tmp;
  length file_path $255. size 8.;
  input file_path size;
run;

出力データtmpは必要なものですが、コードは警告を表示します。

警告:マクロSの明白な呼び出しは解決されていません。

「%」の前に追加の「%」を追加しようとしました。つまり、

filename tmp pipe "find &directory. -type f -printf '%%p %%s\n'"

しかし、それは機能しません。

どうすれば警告を取り除くことができますか? ありがとうございました。


%str%nrstrも試し%nrstr

filename tmp pipe %str("find &directory. -type f -printf '%p %s\n'");
filename tmp pipe %nrstr("find &directory. -type f -printf '%p %s\n'");
filename tmp pipe %str("find &directory. -type f -printf '%%p %%s\n'");
filename tmp pipe %nrstr("find &directory. -type f -printf '%%p %%s\n'");
filename tmp pipe "find &directory. -type f -printf '%str(%%)p %str(%%)s\n'");
filename tmp pipe "find &directory. -type f -printf '%nrstr(%%)p %nrstr(%%)s\n'");

それらのどれも問題を解決しませんでした。

コメント 1

%str()または%nrstr()ラップしようとしましたか?support.sas.com/documentation/cdl/en/mcrolref/62978/HTML/…–

written by Reeza @2019-01-24 02:52:23Z

コメント 2

または%str(%%)p %str(%%s)

written by Reeza @2019-01-24 02:58:54Z

コメント 3

@Reezaは試しましたが、動作していないか、同じ警告を発しています。

written by pe-pe-rry @2019-01-24 03:23:01Z

回答 1 written by トム @2019-01-25 15:22:35Z
2

マクロプロセッサは、二重引用符で囲まれた文字列内のマクロトリガー&%を検索しますが、単一引用符で囲まれた文字列は検索しません。 quote()関数を使用して、文字列を一重引用符で囲むことができます。

%let cmd=find &directory/ -type f -printf '%s %p\n' ;
filename tmp pipe %sysfunc(quote(&cmd,%str(%')));

または、SASコードを使用して、マクロプロセッサの関与を避けることができます。

FILENAMEステートメントを作成する代わりに、データステップを使用してFILENAME()関数を呼び出すことができます。

Instead of making a FILENAME statement you could use a datastep to call the FILENAME() function.

または、filerefをまったく作成できず、代わりにINFILEステートメントでFILEVAR=オプションを使用してコマンドを渡すだけでした。

data _null_;
  rc=filename('TMP'
     ,catx(' ',"find &directory/ -type f -printf",quote('%s %p\n',"'"))
     ,'PIPE');
  put rc= ;
run;
data all_files;
  infile tmp truncover;
  input size file_path $255. ;
run;

注: printf文字列のサイズとパスの順序を逆にすると、スペースが埋め込まれたファイル名がある場合に結果を解析する問題を回避できます。

回答 2 written by トム @2019-01-24 14:24:00Z
0

これはあなたを助けるかもしれません。

%macro get_filenames(location);
filename _dir_ "%bquote(&location.)";
data filenames(keep=memname);
handle=dopen( '_dir_' );
if handle > 0 then do;
count=dnum(handle);
do i=1 to count;
memname=dread(handle,i);
output filenames;
end;
end;
rc=dclose(handle);
run;
filename _dir_ clear;
%mend;
%get_filenames(path)