Захват импортированного имени файла в переменную в SAS - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь найти способ записать в переменную имя файла, которое я импортирую в SAS, поскольку я хочу использовать его для построения имени экспортируемого файла.Например, у меня есть файл TEST.xlsx в каталоге c: \ TEMP, который я хочу импортировать в SAS и после некоторых манипуляций с данными экспортировать результат как TEST-01.xlsx.Может кто-нибудь, пожалуйста, помогите мне сделать это?

Спасибо, Дэн

PROC IMPORT DATAFILE= "c:\TEMP\*.xlsx" DBMS=xlsx out=TABLE_START  REPLACE;          
RUN;

Ответы [ 3 ]

0 голосов
/ 19 мая 2018

Просто сначала найдите имя.

data _null_;
  length fname $300 ;
  infile "c:\TEMP\*.xlsx" filename=fname;
  input @;
  call symputx('fname',fname);
  stop;
run;

Затем вы можете использовать имя файла в вашем ИМПОРТЕ или других шагах.

PROC IMPORT DATAFILE= "&fname" DBMS=xlsx out=TABLE_START  REPLACE;          
RUN;
0 голосов
/ 20 мая 2018

ОП не ясно, нужно ли обрабатывать один или несколько файлов 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Студия просмотра выходных данных.

enter image description here

На этом этапе макропеременные &Name1 и т. Д. Могут быть проанализированы с помощью %scan() для получения имени файла и использованы длязаписывать выходные файлы после дальнейшей обработки с помощью шага DATA.

0 голосов
/ 19 мая 2018

Я не знал, что вы можете использовать подстановочные знаки в PROC IMPORT.Насколько я вижу, не существует простого способа сбора этой информации при использовании этого метода импорта данных.Подстановочные знаки обычно используются в выражении INFILE, и вы пытаетесь прочитать несколько файлов одновременно.Если у вас есть несколько файлов XLSX в папке, я не имею ни малейшего представления о том, что он будет читать, кажется, это первое, что я думаю.И, к сожалению, XLSX также не добавляет больше информации в журнал.

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

%let myfile = 'path to your excel file';

proc import out=want datafile=&myFile. dbms=xlsx replace; run;

data want2;
   set want;
   source = &myfile;
run;

Если бы это были не файлы Excel, были бы другие варианты, но, к сожалению, это XLSX.Например, если вы импортировали несколько файлов CSV, есть опции FILEVAR и FILENAME.

Если бы это было в журнале, вы могли бы сделать это окольным путем, но это тоже не сработало.Это немного странно для меня, поэтому я собираюсь опубликовать его на community.sas.com, чтобы узнать, есть ли предложения у SAS или других опытных пользователей.

...