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

具有多个变量的SAS filevar和fileref的含义,file,sas,ref,File,Sas,Ref,我最近发现了filevar语句。是否可以使用它来编写由多个变量拆分的各种文本文件?我在网上看到的所有示例都只基于一个变量写入了文本文件,这些变量是它们想要分割的 例如:假设我有一个关于汽车的数据集,其中包含一个关于颜色的字符变量、一个详细说明汽车品牌的字符变量和一个详细说明购买年份的数字变量 然后,我是否可以使用filevar一次编写多个文本文件,这些文件被所有这些变量分割(可能是通过在一个filepath中串联它们,然后将此filepath设置为fileref)?所以我得到一个文本文件,mak

我最近发现了filevar语句。是否可以使用它来编写由多个变量拆分的各种文本文件?我在网上看到的所有示例都只基于一个变量写入了文本文件,这些变量是它们想要分割的

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

然后,我是否可以使用filevar一次编写多个文本文件,这些文件被所有这些变量分割(可能是通过在一个filepath中串联它们,然后将此filepath设置为fileref)?所以我得到一个文本文件,make=A,color=Red,year=2000。第二个文本文件具有make=A、color=Blue、year=2000等

另外,我一直看到fileref这个词,但没有清楚地解释它到底是什么。凭直觉,我觉得它只是我们可以在代码中引用的文件名的别名


谢谢。

您可以将
fileref
看作指向文件alac/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;
这将为每个
MAKE生成一个CSV文件,键入
组,列出汽车名称和MSRP

每组:

  • f_name
    是输出的物理文件名。
    filename()
    fopen()
    函数打开文件进行输出<代码>fid
  • 是 对该文件的引用
  • fput()
    将一行放入缓冲区
  • fappend()
    将缓冲区追加到文件中。对标题执行此操作 然后每次记录一次
  • 在组的末尾,关闭 带有
    fclose()的文件

  • 您可以将
    fileref
    视为指向文件的指针,即alac/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;
    
    这将为每个
    MAKE生成一个CSV文件,键入
    组,列出汽车名称和MSRP

    每组:

  • f_name
    是输出的物理文件名。
    filename()
    fopen()
    函数打开文件进行输出<代码>fid
  • 是 对该文件的引用
  • fput()
    将一行放入缓冲区
  • fappend()
    将缓冲区追加到文件中。对标题执行此操作 然后每次记录一次
  • 在组的末尾,关闭 带有
    fclose()的文件

  • 你完全正确;您可以使用
    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

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

    A
    A
    B
    B
    G
    G
    C
    C
    D
    D
    
    但不是这个:

    A
    B
    G
    C
    D
    A
    B
    G
    C
    D
    

    你还必须确保你有合法的文件名(所以不要在
    sashelp.cars
    中使用
    model
    ,除非你把它清理干净,因为里面有很多像
    \
    这样的非法字符)。

    你完全正确;您可以使用
    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

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

    A
    A
    B
    B
    G
    G
    C
    C
    D
    D
    
    但不是这个:

    A
    B
    G
    C
    D
    A
    B
    G
    C
    D
    

    你还必须确保你有合法的文件名(所以不要在
    sashelp.cars
    中使用
    model
    ,除非你把它清理干净,因为里面有很多像
    \
    这样的非法字符)。

    我想你说的是
    文件
    语句中的
    FILEVAR=
    选项。这告诉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 ;
    
    然后添加
    ()
    ,以引用这些目录中的特定文件

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

    我想您所说的是
    FILE
    语句中的
    FILEVAR=
    选项。这告诉SAS使用特定变量的值来查找要写入的文件名。你可以用任何你想要的东西来建造它

    fileref
    是使用
    FILENAME
    语句或
    FILENAME()
    函数时创建的别名。与
    libref
    一样,它是使用
    LIBNAME
    状态时创建的别名