我想在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]