我想导入一个如下所示的文本数据集:
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之后工作?我不明白为什么不应该这样做。
答案 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;