我对SAS很陌生并且有一个非常简单的问题。我有一个文本文件,保存如下:
123,123,345,457,4.55~123,123,345,457,4.55~123,123,345,457,4.55
所以所有数据都写在一行中。 〜字符表示换行符。我的最终目标是将文本文件加载到sas中并创建一个如下所示的SAS数据集:
V1 V2 V3 V4 V5
123 123 345 457 4.55
123 123 345 457 4.55
123 123 345 457 4.55
所以','是分隔符和'〜'是新行字符。 我怎样才能做到这一点?
非常感谢您的回复。
亲切的问候 Consti
答案 0 :(得分:1)
告诉SAS将这两个字符用作分隔符,并将@@
添加到input
语句,以防止它转到新行。
data want ;
infile cards dsd dlm=',~';
input v1-v5 @@ ;
cards;
123,123,345,457,4.55~123,123,345,457,4.55~123,123,345,457,4.55
;;;;
结果
Obs v1 v2 v3 v4 v5
1 123 123 345 457 4.55
2 123 123 345 457 4.55
3 123 123 345 457 4.55
如果您正在读取文件,那么您也可以使用INFILE语句上的RECFM = N选项而不是INPUT语句中的@@
,尽管如果一行实际上有LF或CR / LF结束时你可能还想将它们包含在分隔符列表中。
答案 1 :(得分:0)
Tom的回答对于常规文件是正确的,并且您没有行不一致的问题。
如果你确实需要做你所说的话,那就有可能;您可以通过预处理步骤将~
转换为换行符。这是一种方法。
首先,在数据步骤中浏览dlm为~
的文件;输入字段,直到你运行到行的末尾,并为每个字段输出到临时文件(所以现在该行只有一个数据行)。
现在您有一个临时文件,您可以像往常一样阅读,其中没有~
个字符。
您可以通过多种其他方式执行此操作,例如,使用'0D0A'x查找/替换~
或者您喜欢的首选EOL字符(例如,您可能更容易/更快地使用其他语言)有这个在unix中,并且可以访问perl,例如甚至使用awk / etc。你可以比在SAS中更容易地做到这一点。
filename test_in "c:\temp\test_dlm.txt";
filename test_t temp;
data _null_;
infile test_in dlm='~';
file test_t;
length test_field $32767;
do _n_= 1 by 1 until (_n_ > countc(_infile_,'~'));
input
test_field :$32767. @@;
putlog test_field;
put test_field $;
end;
stop;
run;
data want;
infile test_t dlm=',';
input v1 v2 v3 v4 v5;
run;