2017-03-29 3 views
1

PROC IMPORTSのマクロ変数(%LETを介して割り当てられています)を活用しようとしていますが、ファイル名が201文字を超えています。 (エラー:ファイル名の値が最大201文字を超えています)SASマクロ変数の問題 - 'ファイル名の値が最大長を超えています'

関数の代わりに値として渡されるように変数を定義する別の方法はありますか?

私の古いデータファイルstringが終了 DATAFILE = "... Files_Submitted \ 201612 \リコンサイル\ Q42016は校長balances.xls"

私は DATAFILEにそれを変更している=」... Files_Submitted \ & yrmm。\調整\ &四半期プリンシパル残高xls "

次の変数を使用します。

%LET EOLM= INTNX('MONTH',today(),-&MonthsAgo.); 
%LET yrmm= COMPRESS(year(&EOLM.)||PUT(month(&EOLM.),z2.)); 
%LET qtr = COMPRESS(year(&EOLM.)||COMPRESS('Q'||CEIL(month(&EOLM.)/3))); 

ご協力いただきありがとうございます。

答えて

3

あなたは実際にここに正しい方法を渡しているわけではありません。あなたは問題を引き起こしている2つの異なるものを混在させています。

マクロ変数でこれらの関数の結果を解決することも、関数呼び出しを保存して関数をデータステップに入力したように扱うこともできます。したがって、CATSなどを使用して結合します。

これはそのままですが、これらの機能の結果ではなく、"\\path\to\COMPRESS(INTNX(MONTH..."のようなファイル名になってしまうため、問題になります。

ので、一つの選択:

DATAFILE= cats("...Files_Submitted\",&yrmm.,"\Reconcile\",&quarter.,"Principal balances.xls"; 

あなたが期待するような機能は、それらの値を提供させます。

もう1つの方法は、%SYSFUNCを使用して、マクロ変数で解決される値を求めることです。これはより一般的な方法ですが、確かにどちらも実際にはすべての目的にとって特に優れています。

%LET EOLM= %sysfunc(INTNX(MONTH,%sysfunc(today()),-&MonthsAgo.)); 

他の2つについても同様です。 %SYSFUNC呼び出しでは引用符は使用されないため、MONTHの引用符を削除しています(文字列区切り文字ではなく引用符文字を使用しない場合)。

%LET yrmm= %sysfunc(year(&EOLM.))%sysfunc(month(&EOLM.),z2.); 

ここでは、フォーマットを直接SYSFUNC呼び出しに入れます。また、マクロ変数(通常はテキストを生成する)に連結文字を使用せず、通常はCOMPRESS(必ずしもそうではありません)を使用する必要はありません。ここで

%LET qtr = %sysfunc(year(&EOLM.))Q%sysfunc(CEIL(%sysevalf(%sysfunc(month(&EOLM.))/3))); 

我々は(通常は、マクロ構文で非整数数学を持つことはできません)計算を行うために%SYSEVALFを使用しています。私たちはQから引用符を取り除き、それを一列に並べます。

はすべて一緒にそれを置く:もっと簡単もちろん

%let monthsAgo = 3; 
    %LET EOLM= %sysfunc(INTNX(MONTH,%sysfunc(today()),-&MonthsAgo.)); 
    %put &=EOLM; 
EOLM=20789 
    %LET yrmm= %sysfunc(year(&EOLM.))%sysfunc(month(&EOLM.),z2.); 
    %put &=yrmm; 
YRMM=201612 
    %LET qtr = %sysfunc(year(&EOLM.))Q%sysfunc(CEIL(%sysevalf(%sysfunc(month(&EOLM.))/3))); 
    %put &=qtr; 
QTR=2016Q4 

がyrmm/QTRのためのフォーマットを使用することであったかもしれません...&EOLMから%SYSFUNCを削除し、%SYSFUNCフォーマットオプションは、フォーマットを処理せ

%let yrmm = %sysfunc(putn(&eolm.,yymmn6.)); 
%let qtr = %sysfunc(putn(&eolm.,yyq6.)); 
%put &=yrmm &=qtr; 

たり(これは少しかわいい取得される可能性があります)。番号を保存しないここEOLMますが、あなたが画面に表示されるテキストを格納し、YRMMまたはQTRが定義されるまで数は解決されません。

%LET EOLM= INTNX(MONTH,%sysfunc(today()),-&MonthsAgo.); 
%let yrmm = %sysfunc(&eolm.,yymmn6.); 
%let qtr = %sysfunc(&eolm.,yyq6.); 
%put &=yrmm &=qtr; 
+0

'CATS(...)'ソリューションを動作させることはできませんでしたが、%sysfuncは魅力的に機能します。あなたの迅速かつ詳細な応答をありがとう! –

関連する問題