使用FILE语句

时间:2016-04-13 19:37:41

标签: sas overwrite

我有一个数据集,只用一个变量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。

提前谢谢!

2 个答案:

答案 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年前那么真实;你现在可以通过inputscan,{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;

加法:

  • 填充变量保留200个空格(如果需要更多的空格,则增加)
  • 第一个put语句将空格写入文件的第一行,double trailing-at将指针保存在当前行上
  • 第二个put语句将V1值写入第一列,覆盖部分空白
  • 当数据步骤再次循环时,第一个put将空格写入第一行......

移除:

  • 执行循环,我不确定它们是否是必需的,或者只是尝试在每次到达新行时重新创建文件。默认情况下,数据步骤将_N_从1循环到输入的末尾。