0

所以我有一个相当混乱的文本文件,我正试图将其转换为 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; 输入所有数据$;id = substr(allData, find(allData,"305")-2, 7);

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

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

4

2 回答 2

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 来阅读它是一件轻而易举的事!

于 2012-07-19T23:26:40.187 回答
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;
于 2012-07-30T16:55:29.323 回答