SAS filevar具有多个变量和fileref的含义

时间:2017-07-20 18:44:41

标签: file sas ref

我最近发现了关于filevar的声明。是否可以使用它来编写由多个变量分割的各种文本文件?我在网上看到的所有例子都只根据他们想要拆分的单个变量写入文本文件。

例如:假设我有一个关于汽车的数据集,其中包含关于颜色的字符变量,一个详细说明汽车品牌的字符变量,以及一个详细说明购买年份的数字变量。

然后我可以使用filevar写入由所有这些变量分开的多个文本文件(可能通过在文件路径中连接它们然后将此文件路径设置为fileref)?所以我得到一个make = A,color = Red,year = 2000的文本文件。第二个文本文件,其中make = A,color = Blue,year = 2000等。

此外,我一直看到fileref这个词,但没有明确说明实际是什么。直觉上我觉得它只是我们可以在代码中引用的文件名的别名吗?

感谢。

3 个答案:

答案 0 :(得分:1)

您可以将fileref视为指向文件的指针,ala C / C ++。

您绝对可以使用数据集中的值来驱动文件输出。以下是使用SASHELP.CARS数据中的前几个观察结果的示例。

proc sort data=sashelp.cars (where=(make in ('Acura', 'Audi', 'BMW')))
          out=cars;
by make type;
run;

data _null_;
set cars;
by make type;
retain fid;
if first.type then do;
    f_name = catt("c:\temp\",make,"_",type,".txt");
    rc = filename("temp",f_name);
    fid= fopen("temp","o");
    rc = fput(fid,'make,model,type,msrp');
    rc = fappend(fid);
end;

rc = fput(fid,catx(",",make,model,type,msrp));
rc = fappend(fid);

if last.type then do;
    rc = fclose(fid);
end;
run;

这将为列出车名和MSRP的每个MAKE, TYPE组生成一个CSV文件。

对于每个小组:

  1. f_name是输出的物理文件名。 filename()fopen()函数打开文件以进行输出。 fid是 对文件的引用。
  2. fput()将一行放入缓冲区。
  3. fappend()将缓冲区附加到文件中。为标题执行此操作 然后每次记录一次。
  4. 在小组结束时,关闭 文件fclose()

答案 1 :(得分:1)

你是绝对正确的;您可以使用filevar根据数据集中的数据定义文件名。

这是一个简单的例子,使用sashelp.cars制作一组文件,每个汽车制作一个。

filename a temp;
data _null_;
  set sashelp.cars;
  outname = cats('c:\temp\',make,'.txt');
  file a filevar=outname dlm=',';
  put make $ model $ mpg_city mpg_highway;
run;

a文件名是一个垃圾文件名 - 它就在那里,因为它必须在语法中的那个位置有一些东西。它没有做任何事情(因此temp)。

注意事项:使用此方法,您必须正确排序文件(与您的文件对应的组)。否则它将无法按您希望的方式工作。它不必由该变量在 order 中,但它必须由该变量排列。所以这很好:

A
A
B
B
G
G
C
C
D
D

但不是这样:

A
B
G
C
D
A
B
G
C
D

您还必须确保拥有合法的文件名(因此请勿在{{1​​}}中使用model,除非您清理它,因为它有很多非法字符,例如{{1}在它里面。)

答案 2 :(得分:0)

我认为你在讨论FILEVAR=声明中的FILE选项。这告诉SAS使用特定变量的值来查找要写入的文件的名称。你可以从任何你想要的东西构建它。

fileref是您在使用FILENAME语句或FILENAME()函数时创建的别名。就像libref是使用LIBNAME语句或LIBNAME()函数时创建的别名一样。

因此,您可以定义指向一个或多个文件的fileref。

filename file1 '/project1/source.csv';
filename file2 ('/project1/source1.txt' '/project1/source2.txt');

然后,您可以在以前使用过引用的物理文件名的位置使用fileref。

infile file1 dsd ;
infile file2 eov=eov ;

您还可以使用fileref指向目录。

filename raw '/project1/' ;

然后添加()以引用这些目录中的特定文件。

infile raw('source.csv') dsd ;
infile raw('source1.txt' 'source2.txt') eov=eov;
file raw('export.csv') dsd ;