SAS:输入文本文件时指定换行符

时间:2017-12-14 16:53:04

标签: sas newline

我对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

2 个答案:

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