SAS问题 - 无法读取此数据集的数字列

时间:2013-02-16 18:25:42

标签: sas

我有一个像这样的血液.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 

有人可以帮忙吗?

2 个答案:

答案 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。