2017-01-20 12 views
1

私はこのサークルに1.5時間入っていますので、ここで助けを求めています。私がしようとしているのは、単純な死者ですが、私の人生はプロセスを説明するリンクを見つけることができません。日付値は、マクロ関数に渡されデータステップで設定されたマクロ引数の数値を取得するには

data _null_; 
    some_date = "01JAN2000"D; 
    call symput('macro_input_date',left(put(some_date),date9.))); 
    %useful_macro(&macro_input_date); 
run; 

は(私はこれらに新たなんだ):

は、私は、次のデータのステップがあります。私は日付の値の数値を使用したいと思います - 私は年の値を取得し、日の値でそれを掛けて、そして月の値を3で割った後の余りを引いてみましょう。入力からちょうど年の価値を得るように見えません。

  • に裸の参照を持っている:私は両方の「裸の」と、すべての可能な次のバリアントの順列を表す引数を使って、「%」を先頭に付け、

    • symgetような様々なものを試してみました変数、例えばmacro_input_date
    • を一重引用符で囲みます。 'macro_input_date'
    • は、二重引用符で囲みます。 "macro_input_date"
    • の先頭にアンパサンドが付いています。 %sysfunc(year(<argument as variously specified above>)

    に& macro_input_date

  • ダイレクトコールは、誰もが私が行方不明です何を教えてもらえますか?

    ありがとうございます!

  • +0

    何をしようとしていますかあなたはマクロ変数に入り、それを取り戻す必要がありますか?詳細が必要です。さもなければ基本的な答えはこれをすることではありません... "有用なマクロ機能"は何をしていますか?あなたが指定した方法では、マクロ関数ではありません(それらは等号の右側になければなりません)。 – Joe

    +0

    あなたの問題はちょうどタイミングの1つですか? call symput()が生成した値をマクロが使用するようにするには、 '%useful_macro()'の呼び出しの前に 'RUN;'ステートメントを動かしてください。 – Tom

    +0

    @ジョー、あなたは私が値を割り当てていたはずです。基本的に私はGUI(DI)を使用しており、例えば日付値を対応する整数表現(例えば20000101)に変換したいと考えています。これはデータステップで行うのは簡単ですが、私は効率的で、すでにデータを繰り返し処理している変換でそれを行いたいと思っています。 GUIの限界により、これは2つの変換を使って式*と*を書き直すことを意味します。反復プロセスを合理化するために、GUI変換から呼び出すことのできる関数を作成したいと考えています。優れたアプローチがありますか?ありがとう! – Rookatu

    答えて

    1

    マクロ関数について質問した場合、サンプル日付処理は単なる例に過ぎません。マクロ関数について一般的に言えば、マクロ関数は(一般的に)それ自身の処理を行わないことを理解することが重要です。何らかのタスクを実行するためのデータステップコードを生成するだけです。

    data out; 
        set in; * Assume this contains a numeric called 'some_date'; 
        result = year(some_date) * day(some_date) - mod(month(some_date), 3); 
    run; 
    

    これをmacroiseするには、マクロにデータ値を転送する必要はありませんが、あなただけの変数を転送する必要があります。だから、あなたの不自然な例のようなもののために、データのステップのコードは次のようになります名前:ここvarパラメータの値はリテラルテキストsome_datesome_dateデータステップ変数のではない値であることを

    %macro date_func(var=); 
        year(&var) * day(&var) - mod(month(&var), 3) 
    %mend; 
    
    data out; 
        set in; * Assume this contains a numeric called 'some_date'; 
        result = %date_func(var=some_date); 
    run; 
    

    注意。もちろん、それを行うために他の方法があります - あなたは、実際の日付はリテラルこのマクロを渡すことができますし、それはまだ動作します:

    data out; 
        set in; * Assume this contains a numeric called 'some_date'; 
        result = %date_func(var="21apr2017"d); 
    run; 
    

    ので、それはすべてあなたがやろうとしている正確に何に依存し...多分あなたは結果を別のマクロ変数に代入したいので、データステップの一部にする必要はありません。この場合、%sysfunc関数などで同様のことを行うことができます。

    +0

    情報ありがとう!計算に複数行のコードが必要な場合は、どのように動作しますか?私はここで処女の水の中にいて、「;」の不在をどうしたらいいのか分からない。マクロ内で。いずれにしても、私はすべてを1つの表現にすることができたので、これはうまくいきました。ありがとう! – Rookatu

    +0

    マクロ内のセミコロン( ';')は必須ではありません。マクロの本体(%LETや%IFのようなマクロ文ではないすべてのビット)は、マクロ変数が解決された後、ベースのSASプロセッサに渡されます。セミコロン、そしてこのような場合には、あなたは本当に1つを望んでいません。マクロを呼び出すにもセミコロンは必要ありません。私の例のセミコロンはデータステップステートメントの一部です。 MPRINTをオンにして、結果を%date_func(var = some_date)+ 50に変更してみてください。私が何を意味するかを見る。 –

    +0

    私はそれがそういうものだと思った。これは、私が過ごしたグーグルの時間よりもはるかに速く学習に役立ちました。再度、感謝します! – Rookatu

    0

    あなただけの年間取得しようとしている場合は、あなたのようなものだろう:

    data _null_; 
        some_date = "01JAN2000"D; 
        call symput('macro_input_date',left(put(some_date,date9.))); 
        yearval = substr(symget('macro_input_date'),6,4); 
        put yearval=; 
    run; 
    

    をごマクロ値(&macro_input_date)は、実際の日付値(14610)ではありませんが、テキスト01JAN2000です。したがってyear関数を使用することはできません(INPUTを返さない限り)、substrを使用して年の部分を取得します。

    もちろん、これはマクロ変数とのやりとりが実際にはあまり成し遂げられないので、意味がありません。

    0

    あなたはちょうど日付リテラルに問題がありますか?それは、あなたはどちらかそれをラップする必要がある日付を表すかのようにあなたのデータのステップコードが

    data _null_; 
        some_date = "01JAN2000"D; 
        call symput('macro_input_date',left(put(some_date),date9.))); 
    run; 
    

    ちょうど今、あなたは文字の文字列を扱いたい場合は

    %let macro_input_date=01JAN2000 ; 
    

    と同じことをするつもりされます日付リテラルとして設定する

    "&macro_input_date"d 
    

    またはそれを変換する。

    %sysfunc(inputn(&macro_input_date,date9)) 
    

    なぜ実際の日付の値をマクロ変数に格納しないのですか?

    call symputx('macro_input_date',some_date); 
    

    これは、あなたの日付のようには見えませんが、YEAR()関数の日付のように見えます。

    関連する問題