在infile语句中将文件名指定为变量

时间:2015-11-04 16:17:12

标签: sas

我想将逗号分隔的文本文件转换为管道分隔文件,但我的输入文件名(逗号分隔文件)是变量(flname1)。我正在使用stackoverflow成员建议的下面的代码。只要我在infile语句中指定文件名,但我不知道如何将文件名指定为变量,代码就可以正常工作 -

data _null_;
   enddate=date();
   flname1=compress("d:\temp\wq_" || year(enddate) || put(month(enddate),z2.) || ".txt");
   length x1-x6 $200;
   infile 'flname1' dsd dlm=',' truncover;
   file 'C:\temp\pipe.txt' dsd dlm='|';
   input x1-x6;
   put x1-x6;
run;

我是SAS的新手,我们将非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:2)

您应该能够使用filevar语句中的infile选项,例如:

data _null_;
  enddate=date();
  flname1=compress("d:\temp\wq_"||year(enddate)||put(month(enddate),z2.)||".txt");
  length x1-x6 $200;
  infile myinputfile dsd dlm=',' filevar=flname1 truncover;
  file 'C:\temp\pipe.txt' dsd dlm='|';
  input x1-x6;
  put x1-x6;
run;

documentation解释了有关该选项的更多信息,并在示例5中提供了一个示例。

此致 阿米尔。

答案 1 :(得分:0)

您可能希望实际将此作为宏变量执行 - 这不是filevar的正常用法(如果您的数据集中包含一堆文件名或其他内容,则可以使用它)。

%let filename = d:\temp\wq_%sysfunc(today(),YYMMN6.).txt;
%put &=filename;

data _null_;
  length x1-x6 $200;
  infile "&filename." dsd dlm=',' truncover;
  file 'C:\temp\pipe.txt' dsd dlm='|';
  input x1-x6;
  put x1-x6;
run;

宏变量只是文本替换,因此可以在任何可以输入相同内容的地方使用它们。它们也不需要连接函数 - 除了在键入单词时必须连接 - 所以它更容易要做。

在这里,我使用%sysfunc告诉SAS执行today()函数,第二个参数告诉它如何格式化它 - YYMMN6.是你想要的格式({{ 1}}或类似的)。然后确保使用201506引号而不是"引号,因为后者不允许宏变量解析。