使用SAS Proc Import导入DSV大表时如何按需过滤数据
解决方案:利用Proc Import生成代码后添加过滤逻辑
因为Proc Import本身不支持直接在导入过程中过滤数据,但可以通过以下两步实现边读取边过滤,既保留自动识别列的优势,又避免导入整个大表:
用Proc Import生成导入代码
先读取数据的一小部分(比如前10行),让SAS自动生成包含列名、格式的DATA步代码,省去手动定义所有列的麻烦:proc import datafile="你的DSV文件路径" out=temp_sample dbms=csv replace; /* 分隔符对应你的DSV格式,比如制表符分隔用dbms=tab */ getnames=yes; /* 第一行是列名 */ obs=10; /* 仅读取前10行,快速生成代码 */ run;从日志提取并修改代码,添加过滤条件
运行上面的代码后,去SAS日志里找到自动生成的DATA步代码(类似下面的结构),复制出来:data WORK.TEMP_SAMPLE; infile "你的DSV文件路径" delimiter=',' MISSOVER DSD lrecl=32767 firstobs=2; informat Var1 $3. ; informat Var2 best32. ; informat Var3 $4. ; format Var1 $3. ; format Var2 best32. ; format Var3 $4. ; input Var1 $ Var2 Var3 $ ; run;修改这段代码:
- 把输出数据集名改成你想要的(比如
filtered_data) - 去掉
obs限制(读取整个文件) - 添加过滤条件
if Var2 = 103;,只保留符合条件的行:
data filtered_data; infile "你的DSV文件路径" delimiter=',' MISSOVER DSD lrecl=32767 firstobs=2; informat Var1 $3. ; informat Var2 best32. ; informat Var3 $4. ; format Var1 $3. ; format Var2 best32. ; format Var3 $4. ; input Var1 $ Var2 Var3 $ ; /* 边读取边过滤,只保留Var2等于103的行 */ if Var2 = 103; run;- 把输出数据集名改成你想要的(比如
关键说明
- 这种方法既利用了
Proc Import自动识别列结构的便利性,又通过DATA步的if语句在读取时直接过滤数据,完全不需要先导入整个大表,节省存储空间。 - 如果你的DSV文件用的是其他分隔符(比如制表符),要把
delimiter=','改成对应的分隔符,比如制表符用delimiter='09'x。
内容的提问来源于stack exchange,提问作者a.lay
相关产品推荐
相关产品推荐

