【问题标题】:Updating a variable in naming a file in SAS在 SAS 中命名文件时更新变量
【发布时间】:2016-08-24 07:16:49
【问题描述】:

我对 SAS 有点陌生。我正在尝试更新文件名以通过循环写入 excel 文件,但在分配文件名时遇到问题。这是我的代码:

%MACRO loop;
    %DO year1 = 1995 %TO 2008;
        DATA _NULL_;
            dailyret = catx(STRIP(&year1),
            '''/h1/usr11/angeli/finland/haz/phreg_dailyret_',  '.csv''');

           *to save output to excel;
           ODS TAGSETS.EXCELXP
           file= %QUOTE(dailyret)
           STYLE=minimal
           OPTIONS ( Orientation = 'landscape'
           FitToPage = 'yes'
           Pages_FitWidth = '1'
           Pages_FitHeight = '100' );

           *a block of code that runs the program, irrelevant to my question;

           ods tagsets.excelxp close;

       RUN;
    %END;
%MEND loop;

%loop;

我已经尝试了很多变体,但每次我总是收到一条错误消息,类似于“错误:文件名 DAILYRET 没有逻辑分配”。

有什么方法可以做到这一点,这样我就不必在 "file=" 行中加上物理引号并能够更新年份?

非常感谢!

-天使

【问题讨论】:

  • DATA 步的目的是什么?此外,您似乎在数据步骤的中间混入了很多全局语​​句(ODS、OPTIONS)。
  • DATA 步骤的目的是将连接的字符串分配给变量“dailyret”,这样我就可以将变量“dailyret”分配给文件名。我尝试直接将“catx(STRIP(&year1), '''/h1/usr11/angeli/finland/haz/phreg_dailyret_', '.csv''')” 分配给文件名,但它给了我一个错误出色地。老实说,由于我对 SAS 还很陌生,所以我不确定 ODS 和 OPTIONS 到底是做什么的,但是当我搜索如何创建一个 Excel 文件时,这就是我找到的代码。有什么办法可以更新 MACRO 变量 year1 并将其分配给文件名?
  • 对于这个简单的问题,只需将宏变量引用放置在您想要的位置。对于更复杂的问题,您可能会运行数据 null 步骤来生成宏变量(使用 CALL SYMPUTX() 函数),然后您可以在数据步骤结束后使用该宏变量来生成其他代码,例如 ODS声明。
  • 你有什么版本的 SAS?我注意到一个 CSV 扩展名,您要创建什么类型的 excel 文件,一个数据文件或一个包含表格和报告以及多个工作表的文件?如果只是 CSV 文件,请考虑 proc export。
  • @Tom 我不太明白你说将宏变量引用放在我想要的位置是什么意思。

标签: excel sas


【解决方案1】:

要引用宏变量,请在其前面加上 &。确保使用双引号字符 " 来引用文件名,因为宏触发器不会在单引号内解析。

您还可以选择在宏名称后附加一个句点,以便解析器知道宏变量名称的结束位置并重新开始常规文本。这意味着当您想要附加以句点开头的扩展时,您需要有两个句点,因为第一个句点将用于标记宏变量引用的结束。

%MACRO loop;
  %DO year1 = 1995 %TO 2008;
    ODS TAGSETS.EXCELXP
        file= "/h1/usr11/angeli/finland/haz/phreg_dailyret_&year1..xml"
        STYLE=minimal
        OPTIONS ( Orientation = 'landscape'
                  FitToPage = 'yes'
                  Pages_FitWidth = '1'
                  Pages_FitHeight = '100' 
                )
    ;

*-------------------;
*a block of code that runs the program, irrelevant to my question;
*-------------------;

    ods tagsets.excelxp close;

  %END;
%MEND loop;

【讨论】:

  • 我试过你写的代码,它工作!非常感谢!抱歉,我是这个网站(和 SAS)的新手,之前没有看到您的代码!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多