代码之家  ›  专栏  ›  技术社区  ›  Juan Dela Cruz

是否有一种方法可以立即解析在同一数据步骤的数据步骤中创建的宏变量?

  •  1
  • Juan Dela Cruz  · 技术社区  · 5 年前

    背景是我需要使用文件名命令来执行grep并将结果作为输入。

    这是我的输入数据集 测试

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

    文件名值是我需要grep的实际文件,因为我需要这些文件中的特定字符串来填充firstname和lastname

    代码如下:

    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 回复  |  直到 5 年前
        1
  •  0
  •   Richard    5 年前

    如果您有许多客户文件,那么使用pipe to grep可能是一个代价高昂的操作系统操作,而且在SAS服务器上可能不允许使用(pipe、x、system等)

    您可以使用的通配符功能在单个数据步骤中读取所有模式命名文件。 infile 以及 filename= 用于捕获正在读取的活动文件的选项。

    Sample:

    %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;
    
        2
  •  2
  •   data _null_    5 年前

    这不是测试。您需要使用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;