将数据从具有多个分隔符和字符变量中的换行符的文本文件导入SAS



我想在SAS中读取一个文本文件数据集,该数据集使用两个不同的分隔符"|"和字符串"[end text]"。其排列如下:

var1|var2|var3
4657|366|text that 
has some line 
breaks [end text]
45|264| more text that has
line breaks [end text]

我正试图弄清楚如何识别这两个分隔符。我尝试使用DLMSTR选项,但没有成功:

data new ;
infile 'file.txt' dlmstr='|'||'[report_end]'  DSD firstobs=2 ;
input var1 var2 var3 $;
run;

有没有办法同时使用这两个分隔符?还是我使用了错误的输入样式来导入数据?

SAS可以读取具有嵌入换行符的分隔文件,只要嵌入的换行符使用的字符与正常的行尾不同。因此,如果您的实际观察结果以CRLF(对于Windows文本文件来说是正常的(结束,并且嵌入的换行符只是一个LF字符,那么这些额外的换行符将被视为该字段中的另一个字符。

var1|var2|var3<CR><LF>
4657|366|text that<LF> 
has some line<LF>
breaks [end text]<CR><LF>
45|264| more text that has<LF>
line breaks [end text]<CR><LF>

例如,这里有一个数据步骤,可以转换原始文件。

data _null_;
infile original lrecl=32767 ;
file copy lrecl=1000000 termstr=lf ;
input ;
_infile_ = tranwrd(_infile_,'[end text]','0d'x);
if _n_=1 then _infile_=trim(_infile_)||'0d'x;
len = length(_infile_);
put _infile_ $varying32767. len  ;
run;

但最好将嵌入的换行符替换为其他字符,如^。

data _null_;
infile original truncover ;
file copy lrecl=1000000 ;
input line $char32767.;
len = length(line);
put line $varying32767. len @;
if _n_=1 or index(_infile_,'[end text]') then put ;
else put '^' @;
run;

结果:

var1|var2|var3
4657|366|text that^has some line^breaks [end text]
45|264| more text that has^line breaks [end text]

这很容易阅读。

Obs    var1    var2                      var3
1     4657    366     text that^has some line^breaks [end text]
2     45      264     more text that has^line breaks [end text]

最新更新