在infile数据步骤中使用do循环

时间:2014-04-02 18:44:24

标签: sas

我想导入一个如下所示的文本数据集:

Abc1defxx
Ghi2klmaabb
nop1qrscc
tuv3wxyccbbzz
…

这是我想要的表格:

text    n_names info    name_1  name_2  name_3
Abc     1       def     xx        
Ghi     2       klm     aa      bb    
nop     1       qrs     cc        
tuv     3       wxy     cc      bb      zz 
…                   

当你注意到长度不是常数时,我需要来自n_names的信息来确定我想要多少个变量名。我在这里做的是:

data Dta;
    %let _EFIERR_ = 0; /* set the ERROR detection macro variable */
    infile "\\mypath\import.txt"
        truncover;
    input
        text $ 1 - 3 
        n_names 4 
        info $ 5 
        info1 $ 6-7@;

    do j=0 to n_names;
        %let pos= 7 + &j*2;

        if &j < nrum then
            input @&pos name_&j  $2. @;
        else input @&pos name_&j  $2.;
    end;
run;

我的印象是循环没有继续,j和n_names没有取数值,因为即使我设法获得输出数据集,它也只有name_0列。

循环是否应该在infile之后工作?我不明白为什么不应该这样做。

1 个答案:

答案 0 :(得分:3)

基本上,你在这里做的是读取n_names并按住输入指针,然后继续读取其余部分。这是一个数据线示例。这需要知道最大N_NAMES(如果你想以编程方式找到它):

data want;
input
@1 text $3.
@4 n_names 1. 
@5 info $1.
@6 info1 $2. @; *trailing @ says 'wait for more';

array names $ names_1-names_15; *set _15 to whatever the maximum is;
_i=1;
do _pos = 8 to (6+2*n_names) by 2;
 input @_pos names[_i] $2. @;
 _i=_i+1;
end;
datalines;
Abc1defxx
Ghi2klmaabb
nop1qrscc
tuv3wxyccbbzz
;;;;
run;

你也可以使用数组输入,如果你在此之后没有其他任何东西,并且再次知道你的最大NAME_#或者可以猜测一些高的东西(如果需要你可以编程地弄清楚它)。这是一个数据线示例。如果您使用真实文件,则应使用TRUNCOVER或MISSOVER以确保它不会继续到下一行。

data want;
array names $ names_1-names_15 ;
input
@1 text $3.
@4 n_names 1. 
@5 info $1.
@6 info1 $2.
@8 names[*] $2.
;
datalines;
Abc1defxx
Ghi2klmaabb
nop1qrscc
tuv3wxyccbbzz
;;;;
run;