在SAS中读取分隔文件的特定列
这看起来应该很简单,但我在文档中找不到如何做到这一点。我想读入一个逗号分隔的文件,但它很宽,我只想读几列 我想我可以这样做,但是在SAS中读取分隔文件的特定列,sas,Sas,这看起来应该很简单,但我在文档中找不到如何做到这一点。我想读入一个逗号分隔的文件,但它很宽,我只想读几列 我想我可以这样做,但是@指针似乎指向文本的列,而不是由分隔符定义的列号: data tmp; infile 'results.csv' delimiter=',' MISSOVER DSD lrecl=32767 firstobs=2; @1 id @5 name$ run; 在本例中,我只想根据分隔符读取第1列和第5列中的内容,但SAS正在读取文本文件的位置1和位置5中的内容。所以
@
指针似乎指向文本的列,而不是由分隔符定义的列号:
data tmp;
infile 'results.csv' delimiter=',' MISSOVER DSD lrecl=32767 firstobs=2;
@1 id
@5 name$
run;
在本例中,我只想根据分隔符读取第1列和第5列中的内容,但SAS正在读取文本文件的位置1和位置5中的内容。所以如果输入文件的第一行是这样开始的
1234567,“x”,“y”,“asdf”,“bubba”。。。更多变量
我想要id=1234567
和name=bubba
,但我得到了name=567,“
我意识到我可以在每一列中阅读并删除我不想要的内容,但肯定有更好的方法。的确,@指向的是文本列,而不是分隔列。我发现的唯一使用标准输入的方法是在空白处阅读,即
input
id
blank $
blank $
blank $
name $
;
然后空白
但是,如果您不介意以不同的方式编写输入,那么有一个更好的解决方案
data tmp;
infile datalines;
input @;
id = scan(_INFILE_,1,',');
name = scan(_INFILE_,5,',');
put _all_;
datalines;
12345,x,y,z,Joe
12346,x,y,z,Bob
;;;;
run;
它使格式设置稍微混乱,因为您需要对每个不希望使用基本字符格式的变量使用put或input语句,但根据您的需要可能会更简单。我在回答其他用户的相关问题时想到的另一个选项
filename tempfile temp;
data _null_;
set sashelp.cars;
file tempfile dlm=',' dsd lrecl=32767;
put (Make--Wheelbase) ($);
run;
data mydata;
infile tempfile dlm=',' dsd truncover lrecl=32767;
length _tempvars1-_tempvars100 $32;
array _tempvars[100] $;
input (_tempvars[*]) ($);
make=_tempvars[1];
type=_tempvars[3];
MSRP=input(_tempvars[6],dollar8.);
keep make type msrp;
run;
这里我们使用了一个有效的临时数组(不幸的是,实际上不能是临时的)变量,然后获取我们想要的指定列的内容。对于一个小文件来说,这可能有点过头了——只需读入所有变量并处理它——但是对于100或200个只需要15、18和25个变量的变量,这可能更容易,只要您知道确切需要哪一列。(例如,如果你有CSV格式的普查数据,我可以在处理普查数据时使用它。通常只需要几列,其中大多数是从起始列向下100或200列。)
您必须注意临时数组的长度(必须与您关心的最长列一样长!),并且您必须确保不要弄乱列,因为除非从数据中可以明显看出,否则您无法知道是否弄乱了。如果您知道一些输入语句语法,您可以相当有效地跳过字段,请注意使用(3*dummy)(:$1。)。只读取一个字节也会略微提高性能
data tmp;
infile cards DSD firstobs=2;
input id $ (3*dummy)(:$1.) name $;
drop dummy;
cards;
id,x,y,z,name
1234567, "x", "y", "asdf", "bubba", ... more variables
1234567, "x", "y", "asdf", "bubba", ... more variables
run;
proc print;
run;
你能解释一下吗?
(3*dummy)(:$1。)
?我以前从未见过这个,在找到这篇文章后,我现在实际上正在使用它。很棒的信息。@DukeLuke第一个括号内的列表(3*dummy)是一个变量列表,3表示有多少个。扩展的是(dummy dummy)。第二个括号内的列表是变量列表的信息列表。($1)。冒号是一个修饰符,指定使用“列表输入”“使用informat和$1。是informat。informat列表中的元素数比变量列表短,因此每个变量都会重复informat列表。对于我正在尝试的文件来说,这似乎很好,至少对于我想要遇到和读取的第一个变量来说,在SAS不喜欢它之后……即输入(3*dummy)(:$1)。”账户数量$(38*虚拟)(:$1。)另一个变量$(4*虚拟)(:$1。)anothervar$;
…对此有何想法,或者您是否尝试过以这种方式使用它?我也尝试过使用SCAN,这是下面的另一个建议,但也无法处理我的第二个变量,只有第一个。我想我是在问,这是否应该以我列出的方式工作,创建一组虚拟对象,阅读myvar,创建更多虚拟对象ies,读取我的var,重复,直到文件不再需要读取。我想你应该开始一个新问题。显示你的数据和你使用的程序。“SAS不喜欢它”不太好。