【问题标题】:How to import multiple .dbf files in SAS如何在 SAS 中导入多个 .dbf 文件
【发布时间】:2016-11-13 15:44:20
【问题描述】:
%let dirname = C:\Users\data;
 filename DIRLIST pipe 'dir/B &dirname\*.dbf';

 /* Create a data set with one observation for each file name */
 data dirlist;
     length fname $8.; 
     infile dirlist length=reclen;
     input fname $8.;
 run;

 data all_text (drop=fname);
 set dirlist;
 filepath = "&dirname\"||fname||".dbf";
 infile dummy filevar = filepath length=reclen end=done missover;
 do while(not done);    
 INPUT
 F1               : 2.
 F2              : 2.
 F3               : 2.
 F4               : 10.
 F5               : 4.;
 output;        
 end;    
 run;

问题在于它只读取每个文件的第一行而不是整个文件,然后再移动到下一个文件。变量 F1 也显示为缺失。

欢迎提出建议

【问题讨论】:

  • 我正在尝试使用宏和管道在 SAS 中导入多个 .dbf 文件。我之前使用在线可用的标准代码为不同的文件格式完成了此操作,但我无法为 .dbf 文件执行此操作。我的数据结构如下,所有文件变量都相同:A - 数字长度 2; B - 数字长度 2; c - 数字长度 2; D - 最大数字长度 10; E - 数字长度 4;每个文件名也遵循 xxx_xxxx.dbf
  • 您的代码用于读取文本文件。要读取 DBF 文件,请使用 PROC IMPORT 而不是 DATA STEP。
  • 我相信我可以一次对一个文件使用 PROC IMPORT。但我需要导入 300 多个 .dbf 文件并一起追加到一个文件中。使用 PROC IMPORT 执行此操作的示例代码将非常有帮助

标签: sas sas-macro


【解决方案1】:

所以一个标准的 proc 导入应该是:

 proc import out=sample1 datafile="path to dbf file.dbf" dbms=DBF replace; 
 run;

现在的问题是如何为文件列表中的每个文件生成这组代码。使用来自@Tom 的 CALL EXECUTE 语句是您最好的选择。您还调用创建一个小宏并使用 CALL EXECUTE 为每个文件名调用它。如果您是 SAS 新手,这可能更容易理解。

*Create a macro that imports the DBF

%macro import_dbf(input= , output=);

  proc import out=&out datafile="&output" dbms=DBF replace; 
 run;

%mend;

然后从数据集中调用宏。我将数据集命名为 DBF001、DBF0002 等。

%let dirname=C:\_localdata;

data dirlist;
    informat fname $20.;
    input fname;
    cards;
    data1.dbf
    data2.dbf
    data3.dbf
    data4.dbf
    ;
run;

data out;
    set dirlist;
    str=catt('%import_dbf(input="', "&dirname", '\', fname, '", output=dbf', 
        put(_n_, z4.), ');');
run;

proc print data=out;
run;

【讨论】:

    【解决方案2】:

    一一导入,然后合并。

    %let dirname = C:\Users\data; 
    data filelist ;
      infile "dir /b &dirname\*.dbf" pipe truncover end=eof;
      fileno + 1;  
      input fname $256. ;
      tempname = 'temp'||put(fileno,z4.);
      call execute(catx(' ','proc import replace dbms=dbf'
           ,'out=',tempname,'datafile=',quote(trim(fname)),';run;'
      ));
      if eof then call symputx('lastname',tempname);
    run;
    data want ;
      set temp0001-&lastname;
    run;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多