Как запустить код (макрос?) Для всех наборов данных в библиотеке? - PullRequest
0 голосов
/ 07 июня 2018

Я попытался найти ответ с помощью поиска по форуму, но не нашел решения: https://stackoverflow.com/search?page=3&tab=Relevance&q=listing%20over%20datasets%20sas

/* make all letters lower case */
data steg1;
set steg0b;
email = lowcase(email);
run;

/* stripping down email column */
data steg2;
set steg1;
email = strip(email);
run; 

Я хочу запустить определенный код (длинный, я его опубликовал) для всех наборов данных вопределенная библиотека (вероятно, цикл является правильным способом).Библиотека представляет собой файл Excel со всеми своими листами (который необходимо преобразовать различными способами, в шаге данных).Требуемый вывод - это другой файл в том же каталоге, что и источник, с подходящим именем как «cleaned.xlsx» или аналогичным.

Я поделился некоторым кодом:

%let filepath=
\\mynetworkpath\;

%let filname=
tobecleaned.xlsx;

%let file=
&filepath.\&filename;


libname epostimp xlsx "&file.";

Это заставляет меня получить библиотеку под названием epostimp, где я нахожу разные листы, назовем ее Норвегия, Дания, Швеция.

Теперь я хочу выполнить свой шаг данных для трех наборов данных.

После этого я хочу экспортировать их в тот же файл excel, который я хочу назвать cleaned.xlsx (в cleaned.xlsx я хочу видеть листы Норвегия, Дания, Швеция - как в оригинале).

Проблемы будут:

  • Как сделать цикл с моим шагом данных
  • Как переименовать готовые наборы данных в правильные;Норвегия, Дания, Швеция
  • Как экспортировать их в один файл Excel с именем cleaned.xlsx

Буду рад услышать некоторые предложения о том, как это сделать.

1 Ответ

0 голосов
/ 19 июня 2018

Я считаю, что это, по сути, то, что вы ищете.Имейте в виду, что механизм EXCEL будет создавать листы и диапазоны указанных имен, но это обычно не имеет значения.

По сути, обрабатывая оба файла как библиотеки, можно перебирать элементы библиотеки во входном файле.(входная библиотека), воссоздавая их под тем же именем в выходном файле (выходная библиотека).

Имейте в виду, этот код не очень надежен и выдает ошибку, если выходной файл уже существует.Можно включить автоматическое удаление и создание нового файла, но, по-видимому, предпочтительнее ошибиться из-за осторожности.Кроме того, если имена листов содержат пробелы или специальные символы, это может вызвать некоторые проблемы с итерацией.Например, наличие листа с именем «Лист 1» приведет к тому, что «ii» будет выполнять итерации по «Листу» и «1» по отдельности.

%macro loop_over_sheets(in_file, out_file);
    libname in_lib excel "&in_file.";
    libname out_lib excel "&out_file.";

    %local ii ds_name ds_names;

    /*  Get the dataset names. */
    proc sql noprint;
        select  memname into :ds_names separated by ' '
            from dictionary.members
                where upcase(LIBNAME) = 'IN_LIB';
    quit;

    %do ii = 1 %to %sysfunc(countw(&ds_names.));
        %let ds_name = %scan(&ds_names., &ii.);

        data out_lib.&ds_name.;
            set in_lib."&ds_name.$"n;

            /* ... your code here ... */
        run;
    %end;

    libname in_lib clear;
    libname out_lib clear;
%mend loop_over_sheets;

%loop_over_sheets(&file., &filepath.cleaned.xlsx);

В последней строке используются указанные макропеременные file и filepath из вашегопример.Изменить по необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...