从SAS中的文本文件中读取某些数据行

时间:2018-04-18 22:21:50

标签: text sas data-manipulation

我有一个包含大量信息的文本文件c:\test.txt,我只需要文件中的一些细节。以下是我的数据的外观

an army of ants
bchskkkk/kk/kl
id: intyst@abc.com
subject: this is an email
   to xyz
kkdkdlkadkadk;kd;
jjdjsjdlasjdaljdljd
<st> This is my actual content
      klfjaakjalkjflajflajefljalkfj
      daklkajflkjalfkjaljflkajfkl
 kkdlkal;dka;ldk <st>

在上面以id,subject和带有start和end的几行开头的行就像我在数据集中所需要的那样

这就是我试过的

 filename data 'c:\test.txt';

 data want;
 infile data lrecl=1000 missover;
 input #3 $ id 3-25 #4 $ sub1 10-25  #8 $ cmc 4-55
 run;

以上并没有解决我的目的。我在每个文件中都有大约10k行,上面的格式和文本之间的和可以超过10行。

有没有更好的方法来解决这个问题?

谢谢

1 个答案:

答案 0 :(得分:1)

您无法使用单个输入语句获取数据。

您需要进行“地标”检测才能发现并提取所需的数据部分,同时保留扫描文件时找到的部分。

假设id:始终是一个新的数据集行指示符,并始终作为行的最后一部分出现,以下内容可以正常工作(未经测试):

data messages;
  length id $50;
  length subject $100;
  length message $1000;

  retain id subject message;

  infile data lrecl=1000 _infile_=line;

  input;

  if line =: "id" then do;
    id_line_number = _n_;
    id = substr(line,length("id:")+1);
    subject = "";
    content = "";
  end;

  if subject = "" and line =: "subject:" then do;
    subject = substr(line,length("subject:")+1);
  end;

  if message = "" then do;
    if line =: "<st>" then do;
      * initial line in <st> block;
      message = line;
    end;
  end;
  else do;
    * accumulate lines within <st> block;
    message = trim(message) || ' ' line;
  end;

  * termination of <st> block, triggers a complete record and output to data set;
  if length(message)>4 and substr(message,length(message)-3) = "<st>" then do;
    message = substr(message,5,length(message)-8);
    output;
    message = "";
  end;
run;

如果主题可以被包装并且在后续相邻行中作为缩进内容继续进行,则需要一些额外的编码