我有一个数据集,只用一个变量Data1
称它为V1
,并且我希望将每个条目保存在一个文本文件中,用文本做一些事情 - 文件,然后转到下一个条目。当下一个条目写入文本文件时,我希望它覆盖前一个条目。我正在使用FILE语句,但由于某种原因,它会继续将新条目附加到旧条目。我有以下代码:
data _null_;
set Data1;
do i = _N_;
if i > 0 then do;
file "myfile.txt";
put V1;
end;
end;
run;
当我打开myfile.txt时,我看到所有观察的条目都已保存,每行一行。但是,我想要的是只保存最后一个条目(稍后我会在循环中添加其他内容,但重要的是旧内容被覆盖)。
我尝试添加选项" OLD"到FILE语句,但我收到一条消息,说不再支持OLD。我使用的是SAS 9.4。
提前谢谢!
答案 0 :(得分:1)
很难说出你正在尝试做什么,但一个可能的答案是使用_FILE_
自动变量。
data _null_;
set sashelp.class;
do i = 1 to _N_;
if i > 0 then do;
file "c:\temp\myfile.txt";
_file_ = name;
end;
end;
run;
这是一种称为 _FILE_ Magic 的高级SAS技术。它与 _INFILE_ Magic 相关,这是一种更为人熟知的技术,如果你想做一些事情,比如使用{{1}可用的强大扫描工具,它会非常有用。但是在函数中并不是那么容易获得(尽管现在这个函数不像10年前那么真实;你现在可以通过input
,scan
,{index
获得大部分输入内容。 {1}}等)。如果这就是您要执行此操作的原因,那么您可能需要使用find
或_FILE_
,具体取决于您的具体操作。 _INFILE_
版本使用_INFILE_
来允许您读取/写入相同的文件:
sharebuffers
搜索有关该主题的论文以查看更多详情; Mike Zdeb的_FILE_
Magic(NESUG 2012)和Peter Crawford的More _INFILE_
Magic(SUGI 28/2003)是这些工具的极好例子。
答案 1 :(得分:0)
正如评论中所指出的,这是一种快速而肮脏的方式,可以使用双尾随和指针位置:
data _null_;
set Data1;
filler=repeat(' ',200);
file "myfile.txt";
put @1 filler @@;
put @1 V1 @@;
run;
加法:
put
语句将空格写入文件的第一行,double trailing-at将指针保存在当前行上put
语句将V1值写入第一列,覆盖部分空白put
将空格写入第一行...... 等
移除:
_N_
从1循环到输入的末尾。