首两行存储变量属性的多个txt文件批量导入SAS的实现方法问询
SAS批量导入特殊结构TXT文件解决方案
核心思路:你的文件前三行是元数据(第一行变量标签、第二行变量类型、第三行变量名),实际数据从第4行开始,且所有文件前7个变量固定,所以宏逻辑拆分为3步:读取元数据→生成变量属性控制语句→读取实际数据。
修改后的完整可运行宏代码如下:
%macro text2sas(filenam=); /* 第一步:读取前三行元数据,分别提取变量标签、类型、名称 */ data _null_; infile "../&filenam..txt" dlm='09'x dsd truncover obs=3; length varname $32 varlabel $200 vartype $20 input_stmt label_stmt fmt_stmt $32767; retain input_stmt label_stmt fmt_stmt ""; /* 前7个固定变量配置,可根据你的实际属性调整 */ array fixed_vars{7} $32 _temporary_ ("RELAXT","RAIN","PLUCK","RAPPLE","VRAT","GROSS","PANGLE"); array fixed_types{7} $1 _temporary_ ("C","C","C","N","C","N","C"); /* C=字符型,N=数值型 */ do row=1 to 3; input; /* 遍历所有列,q参数忽略引号内的tab分隔符 */ do col=1 to countw(_infile_, '09'x, 'q'); val = dequote(scan(_infile_, col, '09'x, 'q')); if row=1 then call symputx(cats('label_',col), val, 'l'); else if row=2 then call symputx(cats('type_',col), val, 'l'); else if row=3 then call symputx(cats('name_',col), val, 'l'); end; end; var_count = col-1; call symputx('var_count', var_count, 'l'); /* 生成读入、标签、格式控制语句 */ do i=1 to var_count; vlabel = symget(cats('label_',i)); vtype = symget(cats('type_',i)); /* 前7个变量使用固定属性,保证跨文件一致性 */ if i<=7 then do; vname = fixed_vars{i}; vtype_fmt = fixed_types{i}; end; else do; vname = symget(cats('name_',i)); /* 原始类型映射为SAS类型 */ if vtype in ('string','boolean') then vtype_fmt = 'C'; else if vtype in ('number','date') then vtype_fmt = 'N'; end; /* 拼接INPUT语句 */ if vtype_fmt='C' then input_stmt = catx(' ', input_stmt, cats(vname, ' :$200.')); else if vtype='date' then input_stmt = catx(' ', input_stmt, cats(vname, ' :date9.')); else input_stmt = catx(' ', input_stmt, cats(vname, ' :best32.')); /* 拼接LABEL语句 */ if vlabel ne '' then label_stmt = catx(' ', label_stmt, cats(vname, '=', quote(trim(vlabel)))); /* 拼接格式语句 */ if vtype='date' then fmt_stmt = catx(' ', fmt_stmt, cats('format ', vname, ' date9.')); end; call symputx('input_stmt', input_stmt, 'l'); call symputx('label_stmt', label_stmt, 'l'); call symputx('fmt_stmt', fmt_stmt, 'l'); run; /* 第二步:读取第四行开始的实际数据 */ data &filenam.; infile "../&filenam..txt" dlm='09'x dsd truncover firstobs=4; input &input_stmt.; label &label_stmt.; &fmt_stmt.; run; %put 导入完成:文件&filenam..txt,共导入&sysnobs.条观测; %mend text2sas; /* 批量调用宏 */ %text2sas(filenam=convdat); %text2sas(filenam=tratdat);
调整说明
- 代码里
fixed_vars和fixed_types数组是前7个固定变量的属性配置,你可以根据自己业务中前7个变量的实际类型、长度调整对应值 - 类型映射规则可根据实际文件修改,目前默认规则:
string/boolean→字符型,number→数值型,date→SAS日期型(输出格式为date9.) - 如果需要增加批量读取文件夹下所有txt的功能,只需要配合
dopen/dread函数遍历文件名循环调用宏即可
内容的提问来源于stack exchange,提问作者Melville
相关产品推荐
相关产品推荐

