使用 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 年前那样真实;你可以在输入中做的大部分事情现在可以通过 scanindexfind 等获得。 ).如果这就是你想要这样做的原因,那么你可能想要使用 _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_ 到输入的末尾。