0

我是 SAS 新手,在创建以下程序时遇到了一些困难。

我的要求是传递动态生成的文件名并读取它,这样就不必编写五次代码来从 5 个不同的文件中读取数据,然后在数据集上运行频率。

我提供了下面的代码,并且必须为 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 步:创建一个数据集“my_filenames”,将您要读取的文件名(每行一个)存储在变量 FILE_NAME 中。

第二步:读入文件。

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 回答