Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SAS中读取分隔文件的特定列_Sas - Fatal编程技术网

在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不喜欢它”不太好。