Есть ли способ мгновенного разрешения макропеременной, созданной на шаге данных на одном шаге данных? - PullRequest
0 голосов
/ 11 февраля 2019

Справочная информация заключается в том, что мне нужно использовать команду имени файла для выполнения grep и использовать результат в качестве ввода.

Вот мой набор входных данных с именем test

firstname   lastname   filename
<blank>     <blank>    cus_01.txt
<blank>     <blank>    cus_02.txt

Значения имени файла - это фактические файлы, которые мне нужно найти, потому что мне нужна определенная строка внутри этих файлов для заполнения имени и фамилии

Вот код:

data work.test;
   set work.test;
   call symputx('file', filename);
   filename fname pipe "grep ""Firstname"" <path>/&file.";
   filename lname pipe "grep ""Lastname"" <path>/&file.";
   infile fname;
   input firstname;
   infile lname;
   input lastname; 
run;

Однако макропеременныесозданный внутри шага данных не может быть использован до завершения процедуры шага данных.Итак, это значит, & файл.не может быть разрешен и не может использоваться в имени файла.

Есть ли способ для разрешения макропеременной?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Если у вас много клиентских файлов, использование pipe to grep может быть дорогостоящим действием операционной системы, а на серверах SAS потенциально запрещено (pipe, x, system и т. Д.)

Вы можете прочитатьвсе файлы с именами шаблонов за один шаг данных, используя функцию подстановочного знака infile и параметр filename= для захвата активного файла, считываемого из.

Пример:

%let sandbox_path = %sysfunc(pathname(WORK));

* create 99 customer files, each with 20 customers;

data _null_;
  length outfile $125;
  do index = 1 to 99;
    outfile = "&sandbox_path./" || 'cust_' || put(index,z2.) || '.txt';
    file huzzah filevar=outfile;
    putlog outfile=;

    do _n_ = 1 to 20;
      custid+1;
      put custid=;
      put "firstname=Joe" custid;
      put "lastname=Schmoe" custid;
      put "street=";
      put "city=";
      put "zip=";
      put "----------";
    end;
  end;
run;

* read all the customer files in the path;
* scan each line for 'landmarks' -- either 'lastname' or 'firstname';    

data want;
  length from_whence source $128;
  infile "&sandbox_path./cust_*.txt" filename=from_whence ;
  source = from_whence;
  input;

  select;
    when (index(_infile_,"firstname")) topic="firstname";
    when (index(_infile_,"lastname")) topic="lastname";
    otherwise;
  end;

  if not missing(topic);

  line_read = _infile_;
run;
0 голосов
/ 11 февраля 2019

Это не проверено.Вам необходимо использовать опцию оператора INFILE FILEVAR.

data test;
   input (firstname   lastname   filename) (:$20.);
   cards;
<blank>     <blank>    cus_01.txt
<blank>     <blank>    cus_02.txt
;;;;
   run;

data work.grep;
   set work.test;
   length cmd $128;
   cmd = catx(' ','grep',quote(strip(firstname)),filename);
   putlog 'NOTE: ' cmd=;
   infile dummy pipe filevar=cmd end=eof;
   do while(not eof);
      input;
      *something;
      output;
      end;
   run;
...