解析sas中的文本文件

时间:2012-07-19 19:37:29

标签: database sas

所以我有一个相当混乱的文本文件,我正在尝试转换为sas数据集。它看起来像这样(虽然更大):

0305679  SMITH, JOHN  ARCH05  001  2
ARCH05  005  3
ARCH05  001  7

我正在尝试设置5个单独的变量(ID,名称,作业,时间,小时),但显然只有3个变量出现在第一行之后。我试过这个:

infile "C:\Users\Desktop\jobs.txt" dlm = '  ' dsd missover;
input ID $ name $ job $ time hours;

并没有得到正确的输出,然后我试图解析它

  

infile“C:\ Users \ Desktop \ jobs.txt”dlm =''dsd missover;输入   allData $; id = substr(allData,find(allData,“305”) - 2,7);

但我仍然没有得到正确的输出。有任何想法吗?

编辑:我现在正在尝试使用.scan()和.substr()来分离更大的数据集,如何从数据中对单行进行子集化?

2 个答案:

答案 0 :(得分:2)

您的数据可能不是那么混乱;它可能是一种分层格式,其中第一行包含所有五个变量,后续行包含变量3-5的值。换句话说,在阅读文件时应保留ID和NAME。

如果这是正确的(这是一个分层布局),这是一个可能的解决方案:

data have;
   retain ID NAME;
   informat ID 7. JOB $6. TIME 3. HOURS 1.;
   input @1 test_string $7. @;
   if notdigit(test_string) = 0
      then input @1 ID NAME $12. JOB time hours;
      else input @1 JOB time hours;
   drop test_string;
   datalines;
0305679  SMITH, JOHN  ARCH05  001  2 
ARCH05  005  3 
ARCH05  001  7 
0305680  JONES, MARY  ARCH06  002  4 
ARCH06  005  3 
ARCH07  001  7 
run;

关键是要真正了解原始文件的组织方式。一旦您了解规则,使用SAS阅读它就很容易了!

答案 1 :(得分:0)

 A list input solution could be the following:



data have;
array all(6) $20. ID LNAME FNAME JOB TIME HOURS;
 retain Id Lname Fname;
 drop i;
 input @; 
  nitems = countw(_infile_,', ');  
    if notdigit(scan(_infile_,1)) = 0 then 
     do i = 1 to nitems;
       all(i) = Scan(_infile_,i);
     end;
    else 
     do i = 1 to 3;
    all(i+3) = Scan(_infile_,i);
      if i = 6 then all(i) = all(i)*1;
  end;
datalines;
0305679  SMITH, JOHN  ARCH05  001  2 
ARCH05  005  3 
ARCH05  001  7 
0305680  JONES, MARY  ARCH06  002  4 
ARCH06  005  3 
ARCH07  001  7 
run;

proc print; run;