0

私はSASを初めて使用し、次のプログラムを作成する際にいくつかの問題に直面しています。

私の要件は、動的に生成されたファイル名を渡し、それを読み取ることです。これにより、コードを 5 回記述して 5 つの異なるファイルからデータを読み取り、データセットに対して freqs を実行する必要がなくなります。

以下のコードを提供しましたが、50 を超えるファイルに対してこのコードを記述する必要があります。

コード

filename inp1 '/chshttp/prod/clients/coms/raw/coms_coms_relg_f1102_t1102_c10216_vEL5535.raw';
filename inp2 '/chshttp/prod/clients/coms/raw/coms_coms_relg_f1103_t1103_c10317_vEL8312.raw';
filename inp3 '/chshttp/prod/clients/coms/raw/coms_coms_relg_f1104_t1104_c10420_vEL11614.raw';
filename inp4 '/chshttp/prod/clients/coms/raw/coms_coms_relg_f1105_t1105_c10510_vEL13913.raw';
filename inp5 '/chshttp/prod/clients/coms/raw/coms_coms_relg_f1106_t1106_c10628_vEL17663.raw';

data test;

Do i = 1 to 5;

infile_name = 'inp' || i;

infile infile_name recfm = v lrecl=1800 end=eof truncover;

        INPUT 
                @1      E_CUSTDEF1_CLIENT_ID                          $CHAR5.
                @1235   E_MED_PLAN_CODE                               $CHAR20.
                @1090   MED_INS_ELIG_COVERAGE_IND                     $CHAR20.
                @1064   MED_COVERAGE_BEGIN_DATE                       $CHAR8.
                @1072   MED_COVERAGE_TERM_DATE                        $CHAR8.
                ;

                if E_CUSTDEF1_CLIENT_ID ='00002' then 

                output test;
end;
run;

proc freq data = test;
tables E_CUSTDEF1_CLIENT_ID*E_MED_PLAN_CODE / list missing;

run;

助けてください!!

4

2 に答える 2

0

質問に直接答えるために、各ファイルを読み取って実行するSASマクロを次に示しますPROC FREQ

%macro freqme(dsn);

data test;
   infile "&dsn" recfm = v lrecl=1800 end=eof truncover;

   INPUT  @1   E_CUSTDEF1_CLIENT_ID        $CHAR5.
         @1235   E_MED_PLAN_CODE             $CHAR20.
         @1090   MED_INS_ELIG_COVERAGE_IND   $CHAR20.
         @1064   MED_COVERAGE_BEGIN_DATE     $CHAR8.
         @1072   MED_COVERAGE_TERM_DATE      $CHAR8.
         ;

   if E_CUSTDEF1_CLIENT_ID = '00002';
run;

proc freq data=test;
   tables E_CUSTDEF1_CLIENT_ID*E_MED_PLAN_CODE / list missing;
run;
proc delete data=test;
run;
%mend;

%freqme(/chshttp/prod/clients/coms/raw/coms_coms_relg_f1102_t1102_c10216_vEL5535.raw);
%freqme(/chshttp/prod/clients/coms/raw/coms_coms_relg_f1103_t1103_c10317_vEL8312.raw);
%freqme(/chshttp/prod/clients/coms/raw/coms_coms_relg_f1104_t1104_c10420_vEL11614.raw);
%freqme(/chshttp/prod/clients/coms/raw/coms_coms_relg_f1105_t1105_c10510_vEL13913.raw);
%freqme(/chshttp/prod/clients/coms/raw/coms_coms_relg_f1106_t1106_c10628_vEL17663.raw);

PROC DELETEレポートの作成後にSASデータセットを削除する手順を追加したことに注意してください。後続の処理のためにSASデータセットとしてファイルが必要であるとは言わないので、説明のためにこれをさらに行いました。

これを他のマクロプログラミングのテンプレートとして使用できます。

于 2013-02-20T00:07:13.360 に答える
0

適応できる例を次に示します。これを行うにはさまざまな方法がありますが、これは 1 つの方法であり、どのように周波数を使用するかに依存します。

ステップ 1: データセット 'my_filenames' を作成します。これは、読み取りたいファイル名を 1 行に 1 つずつ、変数 FILE_NAME に格納します。

ステップ 2: ファイルを読み込みます。

data my_data;
set my_filenames;
infile a filevar=file_name <the rest of your options>;
<your input statement>;
run;

proc freq data=mydata;
by file_name;
<your table statements>;
run;

これは単純なデータ ドリブン コードであり、マクロを必要とせず、大量のデータをデータを含むべきではないもの (マクロ変数、ファイル名など) に保存する必要もありません。

于 2013-02-18T18:57:02.277 に答える