我正在尝试使用以下代码在SAS中读取管道分隔的文本文件:
Data MyData;
Infile MyFile Dsd Dlm= '|' Firstobs= 2 Termstr = CRLF Truncover;
Input A: $30.
B: 2.
C: $30.
D: $30.
E: 2.;
Run;
每条记录肯定存在A到C列,但D列和E列可能存在也可能不存在。文件的分隔方式是在两个输入之间有一个管道,但在行的末尾则没有。
下面显示一个示例。
A1|4|C1|D1|5A2|7|C2A3|3|C3|D3|1A4 ...
如何读取最后两个输入为可选的文件?我不想使用Proc Import,因为它是一个大文件,并且A,B和C列具有Proc Import无法很好处理的值范围(根据我的经验)。
当缺少值时,我当前的代码会使A列中的某些值被拉入D列中。
答案 0 :(得分:0)
通常,有些迹象表明E何时结束。一些EOL字符(也许您看不到)。如果是这样,那么您可以将其用作分隔符。
如果无法判断E何时结束,则需要从业务逻辑中找出(E和A中存在哪种值)。如果E只有2长,则可以使用_INFILE_
变量处理该字段。如果总行长为<= 32767:
data want;
infile 'h:\test.txt' dlm='|'; *infile with dlm statement as usual;
input @@; *open input pointer;
call scan(_infile_,5*_N_,pos,len,'|',); *find where the 5Nth field is;
_infile_ = cat(substr(_infile_,1,pos+1),'|',substr(_infile_,pos+2));
*Insert a | there;
input a: $30.
b: 11.
c: $5.
d: $5.
e: 2.
@@
; *note the @@ holding the input pointer;
run;