如何读取SAS中每个标题记录的一个观察值?

时间:2014-04-06 04:47:55

标签: sas

我有以下数据文件

H 321 s main st
P mary e      21 f
P aby e       23 m
P stary e     31 f
P dory e      23 m
H 321 s second st
P lary e      31 m
P laby e      43 m
P ltary e     31 m
P lory e      23 m
P lwey e      43 f
P lwty e      35 f
P lowtetr e   25 m
H 4351 s 35343nd st 

我尝试计算住在某个地址的人数。因此,结果数据集应该有3个观察值。

这是代码

data ch21.test2 ; 
    infile testFile   end = last ;
    retain address ; 

    input  type $1.  @   ;
            if type = 'H' then   
                do ; 
                if _n_ > 1 then 
                output ; 
                total=0 ; 
                input @3 address $3-21 ;        
                end ;
            else if type='P' then 
                input @3 name $12. +1 age 2. +1 gender $1.   ;   
                total+1  ; 
                if last then
                output ; 
    run ;

然而,我只得到一排。

2 个答案:

答案 0 :(得分:2)

我不知道为什么你的代码中只有一行;我运行它时得到两个(可能是三个,我使用的datalines不支持end变量)。但是,do条件周围没有else循环,导致您得到错误的答案(可能比您应该高一个)。你的输入有点令人困惑,因为它结合了输入样式,但特别是没有错;我把它改成了我更舒服的东西,但你的工作也很好(它更难阅读)。然而,我确实给type添加了@ 1,这可能是一个好主意;如果你有意想不到的输入问题,@ 1确保你正在读第一个字符(这就是你想要的)。

如果您仍然只获得一行,则可能是数据文件格式存在问题;也许它是一个UNIX文件,你在Windows机器上阅读,所以它不尊重EOL角色,例如。

data test2 ; 
infile datalines   end = last ;
retain address ; 

input  @1 type $1.  @   ;  *add @1;
        if type = 'H' then   
         do ; 
            if _n_ > 1 then 
            output ; 
            total=0 ; 
            input @3 address $19. ; *converted to formatted style;
         end ;
        else if type='P' then do;  *added do - you had indented here but did not have a do;
            input @3 name $12. @15 age 2. @18 gender $1.; *converted to all formatted style;
            total+1  ; 
        end;                       *added end - assuming if last then output should be outside?;
        if last then
            output ; 
datalines;
H 321 s main st
P mary e      21 f
P aby e       23 m
P stary e     31 f
P dory e      23 m
H 321 s second st
P lary e      31 m
P laby e      43 m
P ltary e     31 m
P lory e      23 m
P lwey e      43 f
P lwty e      35 f
P lowtetr e   25 m
H 4351 s 35343nd st 
;;;;
run;

答案 1 :(得分:-2)

您缺少&。您的数据包含空格。试试这个

data ch21.test2 ; 
    infile testFile   end = last ;
    retain address ; 

    input  type $1.  @   ;
            if type = 'H' then   
                do ; 
                if _n_ > 1 then 
                output ; 
                total=0 ; 
                input @3 address & $18. ;     /*  ADDED &  and corrected to $18. */   
                end ;
            else if type='P' then 
                input @3 name & $12. +1 age 2. +1 gender $1.   ;    /* ADDED & */
                total+1  ; 
                if last then
                output ; 
    run ;