SAS问题-Can';t读取此数据集的数字列

SAS问题-Can';t读取此数据集的数字列,sas,Sas,我有这样一个blood.txt数据集(前5个obs): 我使用以下程序来阅读它: data blood_sum; infile "/path/blood.txt"; input @1 SubjID $ @6 Gender $ @13 BloodType $ @16 AgeGrp $ @22 RBC @29 WBC @34 Cholesterol ; run; 但最后一列“胆固醇”无法显示;所有值都替换为“.”我的日志中有

我有这样一个blood.txt数据集(前5个obs):

我使用以下程序来阅读它:

data blood_sum;
infile "/path/blood.txt";
input @1 SubjID $
      @6 Gender $
      @13 BloodType $
      @16 AgeGrp $
      @22 RBC 
      @29 WBC
      @34 Cholesterol ;
run;
但最后一列“胆固醇”无法显示;所有值都替换为“.”我的日志中有许多注释错误,如下所示:

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 
dos2unix /path/blood.txt /path/blood.txt

有人能帮忙吗?

我猜您是在UNIX系统上运行此程序,但您正在读取的文件(blood.txt)是在Windows系统上创建的,并以二进制模式复制到您的系统中

如果查看日志,您应该注意到在输入行(第37列)的最后一个值后面有一个“点”。显示屏的区域和NUMR部分显示该位置的十六进制代码,在本例中为“0D”,这是一个回车字符。如果使用UNIX编辑器(如vi)打开该文件,您将在每行末尾看到表示为
^M
的字符

您可以从收到新副本的地方下载新副本(确保以文本模式传输文件),也可以将副本转换为UNIX文本文件。要进行转换,您可以使用如下的
dos2unix
命令:

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 
dos2unix /path/blood.txt /path/blood.txt
请注意,如果使用相同的名称,它将覆盖原始文件。当然,我想你已经得到允许了

如果由于某种原因无法转换文件,可以使用管道进行转换。换言之,使用此文件名语句并将内嵌语句更改为从文件名读取:

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;
filename mydata管道“tr-d'\r'
我添加了
truncover
选项,尽管您可能不需要它。如果感兴趣,请在文档中阅读更多信息


顺便说一句,这是一个非常常见的错误,每个人都会发生至少一次。欢迎使用StackOverflow。

我将为这个问题提供一个稍微不同的解决方案,我同意Bob的观点,这个问题是由线路末端的回车引起的

您可以使用内嵌上的TERMSTR选项控制行的终止字符(通常,对于Windows、CR/LF或'0d'x'0a'x;对于Unix,仅'0a'x或LF)

顺便说一下,我觉得你的输入法有点混乱。您在这里混合了输入类型,因此可能不会总是得到一致的结果。事实上,如果您明确指定了格式,这可能永远不会发生

input
@1 subjid $4.
@6 gender $6.
@13 bloodtype $2.
@16 agegrp $5.
@22 rbc best8.
@29 wbc best4.
@34 Cholesterol 3.
;
然后霍乱血清将从34-36读取,你将永远不会有SAS试图在变量中包含37