2

解決済み(Neil Neyman のコメントによる) :

&var1と同じではありませんvar1

DATA local.trow; 
    INFILE csvfile FIRSTOBS=&i OBS=&i;
    INPUT var1 $ var2 $ var3 $ var4 $;
    call symput('var1',var1); *Added line;
    call symput('var2',var2); *Added line;
    call symput('var3',var3); *Added line;
    call symput('var4',var4); *Added line;
RUN;

「*Added line;」でマークされた行を追加します。問題を解決しました。


質問

免責事項: 私は SAS を初めて使用し、このコードの問題にしばらく悩まされてきました。

ループ内で、CSV ファイルから文字列変数をインポートしようとしています。そのうちの 1 つをリモート サーバー ( var1) に渡しますが、問題が発生しています。コードの先頭に含め%let var1 = 'XXE';て、csv ファイルから変数を取得している部分を除外すると、リモート実行が正常に機能し、期待どおりの出力が得られます。

ただし、コードをそのまま実行すると、文字列変数が期待どおりに処理されないように見えます。たとえば、ステートメントは期待どおりの出力を生成します(PROC PRINTつまり、4 つの変数が表示されます) が、タイトルが正しく表示されません。 )が表示されます。タイトルは「タイトル - 1 2007」と表示されます。ログのタイトル行の近くに次のエラーが表示されます。var1im

WARNING: Apparent symbolic reference VAR1 not resolved.

リモート送信も機能しませんが、強調表示中に次のエラーが発生します&VAR1

ERROR: Syntax error while parsing WHERE clause.
ERROR 22-322: Syntax error, expecting one of the following: a quoted string,
              a numeric constant, a datetime constant, a missing value.   

ステートメントは変数を出力できるため、このエラーに本当に混乱してPROC PRINTいます(実際には視覚的に文字列のように見えます)。「引用符付き文字列」は別のタイプの変数ですか?

コードの先頭で明示的に宣言するか、句にvar1手動で入力'XXE'すると、リモート クエリが実行されます。WHERE

テキストファイルの扱いが間違っているのでしょうか?次のようになります。

XXE XXA XXB XXC
XXM XXN XXI XXP
...

私のコード:

LIBNAME local 'C:\...\Pulled Data\New\';
FILENAME csvfile 'C:\...\Pulled Data\New\indexes.txt';

%macro getthedata(nrows,ystart,yend); *nrows is the number of rows in the text file;

    %GLOBAL var1 var2 var3 var4;

    %do i=1 %to &nrows;
        %do m=&ystart %to &yend;

            DATA local.trow; 
               INFILE csvfile FIRSTOBS=&i OBS=&i;
               INPUT var1 $ var2 $ var3 $ var4 $;
            RUN;

            PROC PRINT DATA = local.trow;
            TITLE "Title - &i. &var1. &m";
            var var1 var2 var3 var4;
            RUN;

            proc export data=local.trow
                outfile="C:\...\Pulled Data\New\Indices_&i._&m..csv"
                dbms=csv replace;
            run;

            signon username=_prompt_;
            %syslput VAR1 = &var1;
            rsubmit;
                    libname abc'server/sasdata';    
                    data all2009;
                         set abc.file_2007:; 
                         by index date time;
                         where index in (&VAR1) and time between '8:30:00't and '12:00:00't;
                    run;
            endrsubmit;

        %end;
    %end;
%mend getthedata;

Options MPRINT;

%getthedata(1,2007,2007)
4

1 に答える 1