2016-11-13 3 views
0
%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 отображается как отсутствует.Как импортировать несколько файлов .dbf в SAS

Предложения приветствуются

+0

Я пытаюсь импортировать несколько файлов .dbf в SAS с использованием макросов и труб. Я сделал это раньше для разных форматов файлов, используя стандартный код, доступный в Интернете, но я не смог сделать это для файлов .dbf. Моя структура данных следующая, которая одинакова для всех файлов. переменные: A - числовая длина 2; B - числовая длина 2; c - числовая длина 2; D - максимальная цифровая длина 10; E - числовая длина 4; Также каждое имя файла следует за xxx_xxxx.dbf –

+0

Ваш код предназначен для чтения текстовых файлов. Для чтения файлов DBF используйте PROC IMPORT вместо DATA STEP. – Tom

+0

Я верю, что могу использовать PROC IMPORT для одного файла за раз. Но мне нужно импортировать более 300 файлов .dbf и добавлять их вместе в один файл. пример кода его использования с помощью PROC IMPORT будет очень полезен –

ответ

1

Так стандартный импорт прок будет:

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

Проблема теперь в том, как создать этот набор кода для каждого файла в списке файлов. Использование оператора CALL EXECUTE из @Tom - ваш лучший выбор. Вы вызываете также создаете небольшой макрос и вызываете его для каждого имени файла, используя 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; 
1

Импортируйте их один за другим, а затем объединить их.

%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; 
Смежные вопросы