具有多个变量的SAS filevar和fileref的含义
我最近发现了filevar语句。是否可以使用它来编写由多个变量拆分的各种文本文件?我在网上看到的所有示例都只基于一个变量写入了文本文件,这些变量是它们想要分割的 例如:假设我有一个关于汽车的数据集,其中包含一个关于颜色的字符变量、一个详细说明汽车品牌的字符变量和一个详细说明购买年份的数字变量 然后,我是否可以使用filevar一次编写多个文本文件,这些文件被所有这些变量分割(可能是通过在一个filepath中串联它们,然后将此filepath设置为fileref)?所以我得到一个文本文件,make=A,color=Red,year=2000。第二个文本文件具有make=A、color=Blue、year=2000等 另外,我一直看到fileref这个词,但没有清楚地解释它到底是什么。凭直觉,我觉得它只是我们可以在代码中引用的文件名的别名具有多个变量的SAS filevar和fileref的含义,file,sas,ref,File,Sas,Ref,我最近发现了filevar语句。是否可以使用它来编写由多个变量拆分的各种文本文件?我在网上看到的所有示例都只基于一个变量写入了文本文件,这些变量是它们想要分割的 例如:假设我有一个关于汽车的数据集,其中包含一个关于颜色的字符变量、一个详细说明汽车品牌的字符变量和一个详细说明购买年份的数字变量 然后,我是否可以使用filevar一次编写多个文本文件,这些文件被所有这些变量分割(可能是通过在一个filepath中串联它们,然后将此filepath设置为fileref)?所以我得到一个文本文件,mak
谢谢。您可以将
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
状态时创建的别名