2017-03-31 23 views
1

異なるテキストファイルに多くの異なるデータセットを出力する必要があります。データセットには共通の変数がいくつかありますが、出力する必要がありますが、かなりの変数もあります。私はこれをマクロ化できるように、これらの異なるものを空白で区切られたマクロ変数にロードしました。テキストファイルに出力

私はデータセットをループし、それぞれ異なるテキストファイルに出力するマクロを作成しました。

この目的のために、私はデータステップ内でput文を使用しました。 PUT文は次のようになります。

PUT (all the common variables shared by all the datasets), (macro variable containing all the dataset-specific variables); 

例えば:&はvarsの

%MACRO OUTPUT(); 
    %DO N=1 %TO &TABLES_COUNT; 
     DATA _NULL_; 
      SET &&TABLE&N; 
      FILE 'PATH/&&TABLE&N..txt'; 
      PUT a b c d "&vars"; 
     RUN; 
    %END; 
%MEND OUTPUT; 

は、電流ループ内のデータセットのために出力するために必要なすべての変数を含むマクロ変数です。例えば、に解決さ :

PUT a b c d special1 special2 special5 ... special329; 

は、今の問題は、引用符で囲まれた文字列が長いだけ262文字まで可能です。そして私が出力しようとしているデータセットの中には、このマクロ変数が引用された文字列であり、これらの変数をすべて保持しているため、非常に多くの変数が出力されることがあります。どのように私はこれを行うことができます他の方法はありますか?

+1

PUTステートメントが参照できる変数の数に制限はないと思います。しかしPUTステートメントの途中でコンマを使うのはなぜですか? – Tom

+0

カンマを削除して質問を修正しました。指摘してくれてありがとう! – puk789

+0

引用符も必要ありません... – Joe

答えて

1

私はこれに取り組んでいますが、変数ごとに1つのput文を持っています。 @修飾子を使用すると、新しい行が得られません。例えば

data test; 
a=1; 
b=2; 
c=3; 
output; 
output; 
run; 

data _null_; 
set test; 
put a @; 
put b @; 
put c @; 
put; 
run; 

出力するログには:

800 data _null_; 
801 set test; 
802 put a @; 
803 put b @; 
804 put c @; 
805 put; 
806 run; 

1 2 3 
1 2 3 
NOTE: There were 2 observations read from the data set WORK.TEST. 
NOTE: DATA statement used (Total process time): 
     real time   0.07 seconds 
     cpu time   0.03 seconds 

だから、この構文を使用した2組の値をループにマクロを変更します。

+0

カンマを削除して質問を修正しました。指摘してくれてありがとう! – puk789

2

変数名のリストの前後に引用符を含めないでください。

put a b c d &vars ; 

ありますが、出力を可能な変数の数に任意の制限ではありませんが、出力ラインの長さが長くなればSASは、新しい行に折り返されます。デフォルトの行の長さは現在32,767です(ただし、古いバージョンのSASではデフォルトの行の長さとして256が使用されます)。あなたが望むなら、それをもっと高く設定することができます。たとえば、1,000,000を使用することができます。おそらく上限はお使いのオペレーティングシステムによって異なります。

FILE "PATH/&&TABLE&N..txt" lrecl=1000000 ; 

あなただけ(それはあなたが変数のいずれかを除外されていない場合)共通の変数が前面に表示されていることを確認するには、おそらくあなたは、すべての各テーブルの変数のリストを必要としません。

DATA _NULL_; 
    retain a b c d ; 
    SET &&TABLE&N; 
    FILE "&PATH/&&TABLE&N..txt" lrecl=1000000; 
    put (_all_) (+0) ; 
RUN; 
+0

カンマを削除して問題を修正しました。指摘してくれてありがとう! – puk789

1

あなたが引用符で囲まれた文字列について話している理由はわからない:あなたは& VARS引数を引用しません。

put a b c d &vars; 

ない

put a b c d "&vars"; 

そこに制限はありますが、それははるかに高いです(64K)。

つまり、私はCALL EXECUTEでデータ駆動型にします。これは非常に簡単で、WHEREステートメントの辞書テーブルから出力するデータセットを簡単に判断できると仮定すると、すべてを1ステップで実行します。これには32キロバイトの制限がありますが、実際にそれを回避することができれば、さまざまなビットを複数のコールに分けることができます。また、callstrが32000それを使って呼び出しを実行してから続行します)。

大規模なマクロ変数を管理する必要がなくなります(&VARは実際には&&VAR&Nになり、多くの大きなマクロ変数になります)。

data test; 
    length vars callstr $32767; 
    do _n_ = 1 by 1 until (last.memname); 
    set sashelp.vcolumn; 
    where memname in ('CLASS','CARS'); 
    by libname memname; 
    vars = catx(' ',vars,name); 
    end; 
    callstr = catx(' ', 
    'data _null_;', 
    'set',cats(libname,'.',memname),';', 
    'file',cats('"c:\temp\',memname,'.txt"'),';', 
    'put',vars,';', 
    'run;'); 
    call execute(callstr); 
run; 
関連する問題