所以我有一个相当混乱的文本文件,我正在尝试转换为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()来分离更大的数据集,如何从数据中对单行进行子集化?
答案 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;