【问题标题】:Using SAS macro to import multiple txt files with sequential names使用 SAS 宏导入多个具有顺序名称的 txt 文件
【发布时间】:2013-12-04 21:55:30
【问题描述】:

我有 4 个 txt 文件需要加载到 SAS 并将它们保存为 4 个 sas 文件。以下是文本文件的样子:cle20130805.txt、cle20130812.txt、cle20130819.txt 和 cle20130826.txt。我在 % Macro 下使用了 % Do 循环,以便只调用一次宏来导入 4 个文件。所以这是我的代码:

%macro cle;
  %do i=20130805 %to 20130826 %by 7;
   Data cleaug.cle&i;
     infile "home/abc/cle&i..txt" dlm= '|' dsd firstobs=1 obs=100;
     input a_no b_no c_no;
   run;
 %end;
%mend cle;
%cle

我希望只调用一次 marco 保存 4 个 sas 文件。但是它就是无法成功运行。任何想法我在代码中做错了什么?

谢谢,

【问题讨论】:

  • 如果您希望我们理解“无法成功运行”,请包含错误消息或意外/不希望的结果。
  • 来自 SAS 服务器的两组警告:1) 注意 49-169:在未来的 SAS 版本中,带引号的字符串后标识符的含义可能会发生变化。建议在带引号的字符串和后续标识符之间插入空格。 2)警告:当前正在处理的引用字符串的长度已超过 262 个字节。您可能有不平衡的引号。
  • 两组警告没有帮助。这些警告可能是什么。发布您的完整日志(如果需要,对真实文件名进行混淆)。在问题中,不在 cmets 中。
  • 顺便说一句,我改变了 dlm='|'到 dlm="|"我仍然得到相同的两组警告。
  • 问题解决了!问题是我在 infile 语句中遗漏了一个“/”。因为我在 Unix 服务器上运行 SAS,所以我必须有“/”来获取我的文件的正确目录。当我正确引用我的文件位置时: infile "/home/abc/cle&i..txt" dlm= '|' dsd firstobs=1 obs=100;整个marco运行成功。

标签: sas


【解决方案1】:

我不建议您尝试编写一个宏来导入所有四个文件。要么它是一个你只使用一次的特定宏——在这种情况下,你可以手动编写它并节省你已经花费的时间——或者它是你必须每个月修改的东西或你使用的任何东西它。

相反,让宏只执行一个文件,但包含轻松调用它所需的信息。在这种情况下,听起来您需要一个参数:日期,所以 20130805 或诸如此类。然后给它一个合理的名字,真正说明它的作用。

%macro import_files(date=);
  Data cleaug.cle&date.;
     infile "home/abc/cle&date..txt" dlm= '|' dsd firstobs=1 obs=100;
     input a_no b_no c_no;
   run;
%mend import_files;

现在你叫它:

%import_files(date=20130805)
%import_files(date=20130812)
%import_files(date=20130819)
%import_files(date=20130826)

就像您在上面编写的宏一样简单,甚至对四个日期进行硬编码。如果日期可以以某种方式预测,您也可以非常轻松地生成宏调用(例如,如果有超过 4 个)。如果您真的喜欢循环,您可以列出文件所在位置的目录列表,或者使用 CALL EXECUTE 从数据步骤调用宏。

【讨论】:

  • 谢谢乔。这就是我一开始所做的。但是,我将来需要将更多文件导入 SAS,例如从 20130805 到 20130831 的所有 8 月文件。因此,一个一个调用宏可能有点乏味。这就是为什么我要测试 marco 下的 %do 循环是否会有所帮助。谢谢,
  • 如果您这样做,那么这个宏可能是一个更好的主意 - 将您可能想要导入的日期放入数据集(或 excel 文件/文本文件/等)比尝试使用笨重的 %do 。我还强烈建议将文件放入 one 数据集(您可以在文件名中使用通配符)而不是 30 个单独的数据集,因为您可能也可以从 1 开始进行分析通过 ;而不是做同样的分析 30 次。
  • 嗨,Joe,您能否详细介绍一下您在第一条评论中提到的“目录列表”和“调用执行”?谢谢,
猜你喜欢
  • 2019-04-30
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 2022-08-05
相关资源
最近更新 更多