读取带空白列的定​​界文本文件

时间:2018-12-20 10:35:56

标签: sas

我正在尝试使用以下代码在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列中。

1 个答案:

答案 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;