我有一个像这样的血液.txt数据集(前5个障碍物):
1 Female AB Young 7710 7.4 258
2 Male AB Old 6560 4.7 .
3 Male A Young 5690 7.53 184
4 Male B Old 6680 6.85 .
5 Male A Young . 7.72 187
我使用以下程序来阅读它:
data blood_sum;
infile "/path/blood.txt";
input @1 SubjID $
@6 Gender $
@13 BloodType $
@16 AgeGrp $
@22 RBC
@29 WBC
@34 Cholesterol ;
run;
但最后一栏"胆固醇"无法显示;所有值都被"替换。"我的日志有很多这样的NOTE错误:
NOTE: Invalid data for Cholesterol in line 1 34-37.
RULE: ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0
1 CHAR 1 Female AB Young 7710 7.4 258. 37
ZONE 3222246666624425676623333222323223330
NUMR 1000065D1C501209F5E7077100007E400258D
SubjID=1 Gender=Female BloodType=AB AgeGrp=Young RBC=7710 WBC=7.4 Cholesterol=. _ERROR_=1
有人可以帮忙吗?
答案 0 :(得分:2)
我猜你是在UNIX系统上运行它,但你正在阅读的文件(blood.txt)是在Windows系统上创建的,并以二进制模式复制到你的系统。
如果查看日志,您应该注意到输入行中最后一个值后面有一个“点”(在第37列)。显示器的ZONE和NUMR部分显示该位置的十六进制代码,在本例中为“0D”,这是一个回车符。如果使用UNIX编辑器(如vi)打开文件,您将在每行末尾看到表示为^M
的字符。
您可以从收到的地方下载新的副本(确保以TEXT模式传输文件),也可以将副本转换为UNIX文本文件。要进行转换,您可以使用dos2unix
命令,如下所示:
dos2unix /path/blood.txt /path/blood.txt
请注意,如果使用相同的名称,它将覆盖原始文件。当然,我认为你有权这样做。
如果由于某种原因无法转换文件,可以使用管道进行转换。换句话说,使用此FILENAME语句并更改INFILE语句以从文件名中读取:
filename mydata pipe "tr -d '\r' < /path/blood.txt";
data blood_sum;
infile mydata truncover;
input @1 SubjID $
@6 Gender $
@13 BloodType $
@16 AgeGrp $
@22 RBC
@29 WBC
@34 Cholesterol ;
run;
我添加了truncover
选项,但您可能不需要它。如果感兴趣,请在文档中阅读更多相关信息。
顺便说一句,这是一个非常常见的错误,至少每次都会发生一次。欢迎来到StackOverflow。
答案 1 :(得分:0)
我会针对这个问题给出一个稍微不同的解决方案,我同意鲍勃是由于线路末端的回车引起的。
您可以使用infile上的TERMSTR选项控制一行的终止字符(通常,对于Windows,CR / LF或'0d'x'0a'x;对于Unix,'0a'x或LF)。
http://support.sas.com/kb/14/178.html
data blood_sum;
infile "/path/blood.txt" termstr=CRLF;
input @1 SubjID $
@6 Gender $
@13 BloodType $
@16 AgeGrp $
@22 RBC
@29 WBC
@34 Cholesterol ;
run;
顺便说一句,我发现你的输入法有点令人困惑。您可以在这里混合输入类型,因此您可能无法始终获得一致的结果。事实上,如果您明确指定了格式,这可能永远不会发生!
input
@1 subjid $4.
@6 gender $6.
@13 bloodtype $2.
@16 agegrp $5.
@22 rbc best8.
@29 wbc best4.
@34 Cholesterol 3.
;
然后将从34-36读取Choleserol,你将从未让SAS尝试在变量中包含37。