在下面的代码中,是否有一种简单的方法可以在不使用@符号的情况下附加到文件的最后一行?我想在一个数据步骤中完成所有这些。
data _null_;
file "%sysfunc(pathname(work))\test.txt" lrecl=1000;
do cnt=1 to 10;
put cnt;
end;
put #10 "append to last line";
run;
出于某种原因,我的代码将行指针前进10行而不是第10行。我是否误解了the help doc?即使它确实转到第10行,我如何将列指针移动到行的末尾?
期望的结果:
1
2
3
4
5
6
7
8
9
10append to last line
答案 0 :(得分:3)
我唯一可以从玩具问题中获得输出的方法是使用function get_num($i) {
return (--$i >= 0) ? $i : false;
}
$num=11; // declare in global scope
while(false!==$num=get_num($num)){ // pass it to function as an argument
echo "Number: $num\n";
}
符号。我想这不是答案:
@
在这种情况下,data _null_;
file "%sysfunc(pathname(work))\test.txt" lrecl=1000;
do cnt=1 to 10;
put #(cnt) cnt @;
end;
put +(-1) "append to last line";
run;
按预期运行,将输出移动到所需的行,#
在写入后将指针保持在那里。随后的@
语句可以附加到该行。
为什么它在您的问题示例中不起作用超出了我的范围。
如果没有这种方法,我不会认为有一种简单的方法可以追加到一条线而不跟踪每条线的长度。您可以为每一行构建一个哈希表,并在打印时存储长度。这会让你知道以后要开始写什么列。
答案 1 :(得分:3)
#
运算符相对于当前行工作。 SAS以线性方式写入文件,始终向前移动而不向后移动,除非您告诉它保持行指针(使用@
或@@
)。请注意,如果您在Dom的示例中没有@
,那么您也不会获得所需的行为:那是因为他一直将行指针保留在第一行。
所以你基本上有两个选择:始终向前移动,或者保持行指针并告诉SAS写入保持行指针前面的各行。您可以使用@
或@@
来保存行指针(不跨越数据步骤边界或跨越数据步骤边界)。
写入没有@
的行的唯一方法是在;
on put之前写入该位,您必须编写代码来执行此操作:
data _null_;
file "%sysfunc(pathname(work))\test.txt" lrecl=1000;
do cnt=1 to 9;
put cnt;
end;
put cnt +(-1) "append to last line";
run;
但这似乎有点像作弊。