这似乎应该是直截了当的,但我在文档中找不到如何做到这一点.我想在逗号分隔的文件中读取,但它非常宽,我只想阅读几列.
我以为我可以做到这一点,但@指针似乎指向文本的列而不是分隔符定义的列数:
data tmp;
infile 'results.csv' delimiter=',' MISSOVER DSD lrecl=32767 firstobs=2;
@1 id
@5 name$
run;
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我想根据分隔符读取第1和第5列中的内容,但是SAS正在读取文本文件的位置1和位置5的内容.所以如果输入文件的第一行像这样开始
1234567,"x","y","asdf","bubba",...更多变量......
我想id=1234567和name=bubba,但我发现了name=567, ".
我意识到我可以阅读每一栏并删除我不想要的那些,但必须有更好的方法.
实际上,@确实指向文本列而不是分隔列.使用我发现的标准输入的唯一方法是读取空白,即
input
id
blank $
blank $
blank $
name $
;
Run Code Online (Sandbox Code Playgroud)
然后空白.
但是,如果您不介意以不同方式编写输入,则可以使用更好的解决方案.
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;
Run Code Online (Sandbox Code Playgroud)
它使格式化稍微混乱,因为您需要基本字符格式中不需要的每个变量的put或input语句,但根据您的需要可能更容易.