代码之家  ›  专栏  ›  技术社区  ›  Sirus Dehdari

使用file语句覆盖文件中的文本

  •  0
  • Sirus Dehdari  · 技术社区  · 9 年前

    我有一个数据集,叫它 Data1 只有一个变量, V1 ,然后我想将每个条目保存在文本文件中,对文本文件进行一些处理,然后继续下一个条目。当下一个条目被写入文本文件时,我希望它覆盖上一个条目。我使用的是FILE语句,但出于某种原因,它不断地将新条目附加到旧条目。我有以下代码:

    data _null_;
      set Data1;
      do i = _N_;
        if i > 0 then do;
          file "myfile.txt";
          put V1;
        end;
      end;
    run;
    

    当我打开我的文件时。txt,我看到所有观察的条目都已保存,每行一行。然而,我想要的是只保存最后一个条目(稍后我将向循环中添加其他内容,但重要的是覆盖旧内容)。

    我尝试将选项“OLD”添加到FILE语句中,但我收到一条消息,说不再支持OLD。我正在使用SAS 9.4。

    提前谢谢你!

    2 回复  |  直到 9 年前
        1
  •  1
  •   Joe    9 年前

    很难确定你到底想做什么,但一个可能的答案是使用 _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技术 _文件_魔术 .它与 _INFILE_魔法 ,这是一种更为知名的技术,如果你想做一些事情,比如使用强大的扫描工具 input 但在函数中并不像10年前那么容易获得(尽管现在的情况不如10年前那样真实;您可以在输入中做的大部分事情现在都可以通过 scan , index , find 等)。如果这就是你想这样做的原因,那么你可以使用 _文件_ _INFILE_ 这取决于你到底在做什么。 _填充物_ 使用的版本 sharebuffers 以允许您读/写相同的文件:

    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)和Peter Crawford的 More _INFILE_ Magic (SUGI 28/2003)是这些工具的优秀示例。

        2
  •  0
  •   mjsqu    9 年前

    正如注释中所指定的,这是一种快速而肮脏的方法,使用双尾随at和指针位置:

    data _null_;
    set Data1;
    filler=repeat(' ',200);
    file "myfile.txt";
      put @1 filler @@;
      put @1 V1 @@;
    run;
    

    添加内容:

    • 填充变量保留200个空格(如果需要更多空格,则增加)
    • 第一个 put 语句将空白写入文件中的第一行,双尾随在保持当前行上的指针
    • 第二个 语句在第一列写入V1值,覆盖一些空白
    • 当数据步骤再次循环时,第一个 将空白写入第一行。。。

    远离的:

    • 做循环,我不确定它们是必需的还是只是每次到达新行时尝试重新创建文件。默认情况下的数据步骤循环 _N_ 从1到输入结束。