ОП не ясно, нужно ли обрабатывать один или несколько файлов Excel.
Другой подход к ответу на этот вопрос заключается в ссылке на файл с помощью параметра PIPE
в операторе FILENAME
для передачи результатов команды операционной системы, такой как ls
в Linux или * 1006.* в Windows
Если существует несколько файлов, соответствующих шаблону, как указано в OP, и каждый файл должен быть обработан, необходимо использовать метод, который назначает несколько имен файлов для макропеременных SAS.
В качестве примера данных я буду использовать версии данных Excel из покемона Kaggle с базой данных Stats от Альберто Баррадаса.Я сохранил три файла Excel, содержащие поколение 1, поколение 2 и всех покемонов, в подкаталог на компьютере под управлением Windows.
Чтобы импортировать набор файлов, мы начинаем с создания списка имен файлов и чтения его в набор данных SAS.
%let dirname = /folders/myshortcuts/sf_gitrepos/pokemonData;
filename DIRLIST pipe "dir /B &dirname\*.xlsx";
data dirlist;
length fname $256;
infile dirlist length = reclen;
input fname $varying256. reclen;
run;
Обратите внимание, если ваша установка SAS находится в *Режим 1018 * запрещен для выдачи команд операционной системы.В этом случае вам придется выйти в операционную систему и выполнить команду, чтобы сгенерировать список каталогов и сохранить его в файл.В Windows это выглядит следующим образом:
dir /b *.xlsx > excelfiles.txt
Обратите внимание, что параметр /b
означает «пустой» и печатает список каталогов без сводной информации.Поскольку я использую версию SAS University для этого ответа, мне пришлось использовать следующий код для чтения имен файлов в SAS.
data dirlist;
length fname $256;
infile "/folders/myshortcuts/sf_gitrepos/pokemonData/excelfiles.txt" length=reclen;
input fname $varying256. reclen;
run;
Вывод из журнала SAS:
1 OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
72
73 data dirlist;
74 length fname $256;
75 infile "/folders/myshortcuts/sf_gitrepos/pokemonData/excelfiles.txt" length=reclen;
76 input fname $varying256. reclen;
77 run;
NOTE: The infile "/folders/myshortcuts/sf_gitrepos/pokemonData/excelfiles.txt" is:
Filename=/folders/myshortcuts/sf_gitrepos/pokemonData/excelfiles.txt,
Owner Name=root,Group Name=vboxsf,
Access Permission=-rwxrwx---,
Last Modified=20May2018:03:56:41,
File Size (bytes)=38
NOTE: 3 records were read from the infile "/folders/myshortcuts/sf_gitrepos/pokemonData/excelfiles.txt".
The minimum record length was 10.
The maximum record length was 12.
NOTE: The data set WORK.DIRLIST has 3 observations and 1 variables.
NOTE: DATA statement used (Total process time):
real time 0.01 seconds
cpu time 0.01 seconds
Далее мы сгенерируем одну макропеременную SAS для каждого имени файла, используя функцию INTO
PROC SQL, как описано в статье Уильяма Мерфи. Изменение переменных набора данных на макропеременные статья из конференции пользователей SAS 2007 года.
proc sql noprint;
select count(*) into :NObs from dirlist;
select fname into :Name1-:Name%left(&NObs) from dirlist;
run;
... и вывод из журнала SAS:
1 OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
72
73 proc sql;
74 select count(*) into :NObs from dirlist;
75 select fname into :Name1-:Name%left(&NObs) from dirlist;
MPRINT(LEFT): Name3
76 run;
NOTE: PROC SQL statements are executed immediately; The RUN statement has no effect.
77
78 OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
91
Наконец, мы напишем и выполним макрос SAS для итеративного запуска PROC IMPORT
для импорта Excelфайлы.
%macro genimport;
%local i;
%do i = 1 %to &NObs;
proc import out=want&i datafile="&dirname/&&Name&i" dbms=xlsx replace;
run;
%end;
%mend;
%genimport;
... и вывод:
1 OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
72
73 %macro genimport;
74 %local i;
75 %do i = 1 %to &NObs;
76 proc import out=want&i datafile="&dirname/&&Name&i" dbms=xlsx replace;
77 run;
78 %end;
79 %mend;
80 %genimport;
MPRINT(GENIMPORT): proc import out=want1 datafile="/folders/myshortcuts/sf_gitrepos/pokemonData/gen01.xlsx" dbms=xlsx replace;
MPRINT(GENIMPORT): RXLX;
MPRINT(GENIMPORT): run;
NOTE: One or more variables were converted because the data type is not supported by the V9 engine. For more details, run with
options MSGLEVEL=I.
NOTE: The import data set has 165 observations and 13 variables.
NOTE: WORK.WANT1 data set was successfully created.
NOTE: PROCEDURE IMPORT used (Total process time):
real time 0.06 seconds
cpu time 0.03 seconds
MPRINT(GENIMPORT): proc import out=want2 datafile="/folders/myshortcuts/sf_gitrepos/pokemonData/gen02.xlsx" dbms=xlsx replace;
MPRINT(GENIMPORT): RXLX;
MPRINT(GENIMPORT): run;
NOTE: One or more variables were converted because the data type is not supported by the V9 engine. For more details, run with
options MSGLEVEL=I.
NOTE: The import data set has 106 observations and 13 variables.
NOTE: WORK.WANT2 data set was successfully created.
NOTE: PROCEDURE IMPORT used (Total process time):
real time 0.05 seconds
cpu time 0.04 seconds
MPRINT(GENIMPORT): proc import out=want3 datafile="/folders/myshortcuts/sf_gitrepos/pokemonData/Pokemon.xlsx" dbms=xlsx replace;
MPRINT(GENIMPORT): RXLX;
MPRINT(GENIMPORT): run;
NOTE: One or more variables were converted because the data type is not supported by the V9 engine. For more details, run with
options MSGLEVEL=I.
NOTE: The import data set has 800 observations and 13 variables.
NOTE: WORK.WANT3 data set was successfully created.
NOTE: PROCEDURE IMPORT used (Total process time):
real time 0.16 seconds
cpu time 0.13 seconds
Чтобы подтвердить, что мы прочитали файлы в SAS, мы можем просмотреть один из результирующих наборов данных SAS в SASСтудия просмотра выходных данных.
На этом этапе макропеременные &Name1
и т. Д. Могут быть проанализированы с помощью %scan()
для получения имени файла и использованы длязаписывать выходные файлы после дальнейшей обработки с помощью шага DATA
.