1

さまざまなデータ セットにインポートしようとしている 17 個のフラット ファイルのリストがあります。すべてのファイルに同じデータ ステップがあるため、do while ループを記述してすべてのファイルをインポートしようとしています。

私は成功せずにここからいくつかのコードを適応させようとしました: http://www.sas.com/offices/europe/uk/support/sas-hints-tips/tips-enterprise-csv.html

http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#a000543785.htm

というエラーが表示されます%do statement is not valid in open code。これが私のコードです:

% let path1 = 'c:\path1'
% let path2 = 'c:\path2'
...
% let pathN = 'c:\pathN' 

%let n=1; 

%do %while (&n <= 17);
%let pathin = &path&n;

  data retention&n;
    infile &pathin;
    <data step-->
  run;

%let n=%eval(&n+1); 
%end;

do-while ループの外でデータ ステップをテストしましたが、コードを使用して一度に 1 つのファイルに対して正常に動作し%let pathin = &path&nます。コードは最初のデータセットのデータファイルを書き込みます。しかし、すべてのファイルをループできるようにする必要があり、その方法がわかりません。これが初心者の質問である場合は申し訳ありません。私はちょうどSASを学んでいます。

ありがとう - アレックス

4

2 に答える 2

5

SASプログラミングへようこそ!あなたが得たエラーメッセージは手がかりです。「オープンコード」とは、SASシステムによって直接実行されるステートメントを指します。%doステートメントはSASマクロ言語の一部であり、 「通常の」SASではありません。%letステートメントはオープンコードで実行でき、(コンパイルされたマクロとは異なる)を作成するために使用されますmacro variable

%macroコンパイルされたSASマクロは、ステートメントとステートメントの間に表示されるコードによって作成されます%mend。たとえば、次のコードを使用します。

%macro run_me;
%let n=1; 

%do %while (&n <= 17);
%let pathin = &path&n;

  data retention&n;
    infile &pathin;
    <data step-->
  run;

%let n=%eval(&n+1); 
%end;
%mend;

しかし、それはマクロを定義/コンパイルすることだけです。実行するには、ステートメントを発行する必要があります%run_me;run_me名前は私が作った名前にすぎないことに注意してください。

詳細については、SASマクロリファレンス、特に紹介セクションを参照してください。

于 2012-07-25T23:09:33.947 に答える
0

プログラムをマクロに変換するには、ステートメントで宣言されたマクロ変数LETをマクロ引数に変換します。

%macro readfile(n, pathin);

  data retention&n;
    infile &pathin;
    <data step-->
  run;

%mend;

マクロを繰り返し呼び出すためのデータ ステップ。ここでは、データはCARDSステートメントに含まれていますが、ステートメントを介してテーブルから読み取ることもできますSET。マクロ呼び出しは、call executeルーチンを介して実行されます。

data _null_;
length path $200 stmt $250;
input path;
stmt = catt('%readfile(', putn(_N_, 3. -L), path, ')');
call execute(stmt);

cards;
c:\file1.txt
c:\file2.txt
c:\file3.txt
;
run;
于 2012-07-26T06:37:41.977 に答える