2015-01-01 1 views
0

У меня есть около 50 файлов excel (xlsx format) для импорта в sas, а затем необходимо добавить их для анализа. Все заголовки файлов excel одинаковы, то есть имена переменных одинаковы для всего файла. Мне нужен макрос для импорта и добавления всех из них за один раз, а не для импорта всех файлов по одному, а затем добавить его. Ваша помощь очень ценится.Как написать макрос для импорта нескольких файлов excel (xlsx) в sas и добавить его

Другая проблема с файлом excel заключается в том, что между именем переменной и точками данных находится пустой столбец. Я написал код, удалив его с помощью шага данных, но пришло, что мы пишем это также в макроре при импорте.

Data XXX.yyy; 
    Set XXX.yyy; 
    if missing(coalesceC(of ASC Brand Cdesc1 Cust_ DGM Desc Family Grp1 High_Level_Product_Desc 
    Issf Name Prod_Desc Product__Code RVP SA_Desc Terr_ UOM Yr 
    )) and missing(coalesce(of Acc Int_Margin M_Cost Mth Net_Sales Sls__ Uts)) then delete; 

run;

ответ

0

Другой способ сделать это - использовать движок Excel LIBNAME. Вы объявляете библиотеку для каждого из ваших файлов, а затем читаете все листы в 1 Шаг данных.

В этом примере у меня есть 2 книги (Book1.xlsx и Book2.xlsx) в C: \ temp. Все данные указаны в Sheet1. 3 переменные - X, Y и Z. Модифицируйте по мере необходимости для своей цели.

data files; 
format file $12.; 
input file $; 
datalines; 
Book1.xlsx 
Book2.xlsx 
; 
run; 

%macro read_excel(dir,outdata,files); 
    data _null_; 
    set &files end=last; 

    call execute("libname t" || strip(put(_n_,8.)) || " excel '&dir\" || strip(file) || "';"); 

    if last then 
     call symput("n",_n_); 
    run; 

    data &outdata; 
    set 
    %do i=1 %to &n; 
     t&i.."Sheet1$"n 
    %end; 
    ; 

    a = sum(x,y,z); 
    if missing(a) then delete; 
    run; 

    %do i=1 %to &n; 
     libname t&i clear; 
    %end; 
%mend; 

%read_excel(c:\temp,data_from_excel,files); 
1

Звучит так, как будто существующий код уже делает то, что вам нужно. Я сомневаюсь, что от попыток импортировать все 50 файлов на один шаг данных будет очень большой прирост производительности (что возможно через dde, но довольно неудобно).

Если ваш существующий код настроен для обработки только одного файла с жестким кодом, я бы предложил использовать его для написания простого макроса, который принимает один файл excel в качестве входных данных, импортирует этот файл и добавляет его в главный набор данных , Затем вы можете вызвать макрос 50 раз.

например. Вы можете написать макрос, как что-то вроде этого, включающий в себя все соответствующие биты кода, и заменить все ссылки на конкретные файлы с макропеременными:

%macro import_and_append(excel_file,base_dataset); 
    proc import datafile = "&excel_file" dbms = excel out = t_import; 
    run; 

    proc append base = &base_dataset data = t_import; 
    run; 

    proc datasets lib = work nolist nowarn; 
    delete t_import; 
    run; 
    quit; 
%mend; 

Затем вы можете вызвать макрос следующим образом:

%import_and_append(c:\excel_file_01.xls,work.master_dataset) 
+0

0 Да, я уже сделал с импортом, но все же у меня есть это для 50 файлов, поэтому мне нужно повторить шаг несколько раз, поэтому я хотел написать макрос. Но я новичок в sas начал учиться всего за месяц до этого, так что очень плохо на макросе, поэтому любой код для этого будет полезен. –

+0

Я добавил вам пример, чтобы вы могли видеть, как выглядит основной синтаксис. Вы должны иметь возможность адаптировать свой существующий код для работы аналогичным образом. – user667489