使用 FILE 语句覆盖文件中的文本
Overwriting text in file using FILE Statement
我有一个数据集,只用一个变量 V1
称它为 Data1
,因此我想将每个条目保存在一个文本文件中,用文本文件,然后转到下一个条目。当下一个条目写入文本文件时,我希望它覆盖前一个条目。我正在使用 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。
提前致谢!
很难准确地说出您要做什么,但一种可能的答案是使用 _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;
这是一种高级 SAS 技术,称为 _FILE_Magic。它与 _INFILE_Magic 有关,这是一种更广为人知的技术,如果您想做一些事情(例如使用 input
可用的强大扫描工具,但不是在函数中很容易获得(虽然现在不像 10 年前那样真实;你可以在输入中做的大部分事情现在可以通过 scan
、index
、find
等获得。 ).如果这就是你想要这样做的原因,那么你可能想要使用 _FILE_
或 _INFILE_
,具体取决于你正在做什么。 _INFILE_
使用 sharebuffers
的版本允许您 read/write 同一个文件:
data _null_;
set sashelp.class;
do i = 1 to _N_;
if i > 0 then do;
infile "c:\temp\myfile.txt" sharebuffers;
file "c:\temp\myfile.txt";
_infile_ = name;
end;
end;
run;
搜索有关该主题的论文以查看更多详细信息; Mike Zdeb 的 _FILE_
Magic (NESUG 2012), and Peter Crawford's More _INFILE_
Magic (SUGI 28/2003) 是这些工具的极好例子。
正如评论中所指出的,这是一种使用双尾随和指针位置的快速而肮脏的方法:
data _null_;
set Data1;
filler=repeat(' ',200);
file "myfile.txt";
put @1 filler @@;
put @1 V1 @@;
run;
增加:
- 填充变量保留 200 个空格(如果需要更多空格则增加)
- 第一个
put
语句将空格写入文件的第一行,双尾随-at保存当前行的指针
- 第二个
put
语句在第一列写入V1值,覆盖一些空白
- 当数据步骤再次循环时,第一个
put
将空格写入第一行...
等等
已移除:
- 做循环,我不确定它们是否是必需的,或者只是在每次到达新行时尝试重新创建文件。默认情况下,数据步骤从 1 循环
_N_
到输入的末尾。
我有一个数据集,只用一个变量 V1
称它为 Data1
,因此我想将每个条目保存在一个文本文件中,用文本文件,然后转到下一个条目。当下一个条目写入文本文件时,我希望它覆盖前一个条目。我正在使用 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。
提前致谢!
很难准确地说出您要做什么,但一种可能的答案是使用 _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;
这是一种高级 SAS 技术,称为 _FILE_Magic。它与 _INFILE_Magic 有关,这是一种更广为人知的技术,如果您想做一些事情(例如使用 input
可用的强大扫描工具,但不是在函数中很容易获得(虽然现在不像 10 年前那样真实;你可以在输入中做的大部分事情现在可以通过 scan
、index
、find
等获得。 ).如果这就是你想要这样做的原因,那么你可能想要使用 _FILE_
或 _INFILE_
,具体取决于你正在做什么。 _INFILE_
使用 sharebuffers
的版本允许您 read/write 同一个文件:
data _null_;
set sashelp.class;
do i = 1 to _N_;
if i > 0 then do;
infile "c:\temp\myfile.txt" sharebuffers;
file "c:\temp\myfile.txt";
_infile_ = name;
end;
end;
run;
搜索有关该主题的论文以查看更多详细信息; Mike Zdeb 的 _FILE_
Magic (NESUG 2012), and Peter Crawford's More _INFILE_
Magic (SUGI 28/2003) 是这些工具的极好例子。
正如评论中所指出的,这是一种使用双尾随和指针位置的快速而肮脏的方法:
data _null_;
set Data1;
filler=repeat(' ',200);
file "myfile.txt";
put @1 filler @@;
put @1 V1 @@;
run;
增加:
- 填充变量保留 200 个空格(如果需要更多空格则增加)
- 第一个
put
语句将空格写入文件的第一行,双尾随-at保存当前行的指针 - 第二个
put
语句在第一列写入V1值,覆盖一些空白 - 当数据步骤再次循环时,第一个
put
将空格写入第一行...
等等
已移除:
- 做循环,我不确定它们是否是必需的,或者只是在每次到达新行时尝试重新创建文件。默认情况下,数据步骤从 1 循环
_N_
到输入的末尾。