需要使用sas重复从多个文件读取数据,并在从不同文件创建的不同数据集上运行freqs
我是SAS的新手,在创建以下程序时遇到了一些困难 我的要求是传递动态生成的文件名并读取它,这样就不必写五次代码从5个不同的文件中读取数据,然后在数据集上运行freqs 我已经提供了下面的代码,并且必须为50多个文件编写此代码: 代码需要使用sas重复从多个文件读取数据,并在从不同文件创建的不同数据集上运行freqs,sas,Sas,我是SAS的新手,在创建以下程序时遇到了一些困难 我的要求是传递动态生成的文件名并读取它,这样就不必写五次代码从5个不同的文件中读取数据,然后在数据集上运行freqs 我已经提供了下面的代码,并且必须为50多个文件编写此代码: 代码 filename inp1 '/chshttp/prod/clients/coms/raw/coms_coms_relg_f1102_t1102_c10216_vEL5535.raw'; filename inp2 '/chshttp/prod/clients/co
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;
请帮忙 下面是一个您可以调整的示例。有不同的方法可以做到这一点,但这是一个-不取决于你想要的频率 步骤1:创建一个数据集“my_filenames”,它将要读取的文件名存储在一个变量文件名中,每行一个 步骤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;
数据我的数据;
设置我的文件名;
填充一个filevar=文件名;
;
跑
proc freq data=mydata;
按文件名;
;
跑
这是一个简单的数据驱动代码,不需要宏,也不需要在不应该包含数据的东西(宏变量、文件名等)中存储大量数据。要直接回答您的问题,这里有一个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数据集进行后续处理
您可以将其用作其他宏编程的模板。您希望对每个文件单独运行
PROC FREQ
(如您的问题标题中所述)还是对所有文件的组合运行(如您的示例中所述)?嗨,Bob,根据我的要求,我需要对每个文件单独运行PROC FREQ。我无法写下一个逻辑,通过该逻辑我可以将数据集名称作为变量(通过循环生成)传递,并将输入文件引用作为变量(通过循环生成)传递,然后在动态命名的数据集上的每次迭代上运行PROC FREQ。为什么需要将每个文件分开?带有BY语句的PROC FREQ将完全像每个文件都是独立的一样运行,而无需管理多个数据集。