Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SAS中导入多个.dbf文件_Sas_Sas Macro - Fatal编程技术网

如何在SAS中导入多个.dbf文件

如何在SAS中导入多个.dbf文件,sas,sas-macro,Sas,Sas Macro,问题是,在移动到下一个文件之前,它只读取每个文件的第一行,而不是整个文件。变量F1也显示为缺失 欢迎提出建议将其逐一导入,然后合并 %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.;

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


欢迎提出建议

将其逐一导入,然后合并

%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;

逐个导入它们,然后合并它们

%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;

因此,标准proc导入将是:

%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;
现在的问题是,如何为文件列表中的每个文件生成这组代码。使用@Tom的CALL-EXECUTE语句是最好的选择。您还可以使用callexecute调用create一个小宏,并为每个文件名调用它。如果您是SAS的新手,这会更容易理解

 proc import out=sample1 datafile="path to dbf file.dbf" dbms=DBF replace; 
 run;
然后从数据集中调用宏。我将数据集命名为DBF001、DBF0002等

*Create a macro that imports the DBF

%macro import_dbf(input= , output=);

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

%mend;

因此,标准proc导入将是:

%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;
现在的问题是,如何为文件列表中的每个文件生成这组代码。使用@Tom的CALL-EXECUTE语句是最好的选择。您还可以使用callexecute调用create一个小宏,并为每个文件名调用它。如果您是SAS的新手,这会更容易理解

 proc import out=sample1 datafile="path to dbf file.dbf" dbms=DBF replace; 
 run;
然后从数据集中调用宏。我将数据集命名为DBF001、DBF0002等

*Create a macro that imports the DBF

%macro import_dbf(input= , output=);

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

%mend;

我正在尝试使用宏和管道在SAS中导入多个.dbf文件。我以前使用在线提供的标准代码对不同的文件格式执行过此操作,但是我无法对.dbf文件执行此操作。我的数据结构如下,对于所有文件变量都是相同的:A-数值长度2;B-数字长度2;c-数字长度2;D-最大数字长度10;E-数字长度4;此外,每个文件名都跟在xxx_xxxx.dbfy后面。您的代码用于读取文本文件。要读取DBF文件,请使用PROC IMPORT而不是数据步骤。我相信我可以一次对一个文件使用PROC IMPORT。但我需要导入300多个.dbf文件,并将它们附加到一个文件中。使用PROC IMPORT执行此操作的示例代码将非常有用。我正在尝试使用宏和管道在SAS中导入多个.dbf文件。我以前使用在线提供的标准代码对不同的文件格式执行过此操作,但是我无法对.dbf文件执行此操作。我的数据结构如下,对于所有文件变量都是相同的:A-数值长度2;B-数字长度2;c-数字长度2;D-最大数字长度10;E-数字长度4;此外,每个文件名都跟在xxx_xxxx.dbfy后面。您的代码用于读取文本文件。要读取DBF文件,请使用PROC IMPORT而不是数据步骤。我相信我可以一次对一个文件使用PROC IMPORT。但我需要导入300多个.dbf文件,并将它们附加到一个文件中。使用PROC导入的示例代码将非常有用