【问题标题】:SAS to count excel observationsSAS 计算 excel 观察值
【发布时间】:2014-04-10 12:22:24
【问题描述】:

我必须对大约 500 个 excel 文件的一些 excel 文件进行帐户对帐。

我不需要按文件只匹配帐号。

Example file 1: \\directory\Loaded\Jan2014\excel1

Example file 2: \\directory\Loaded\Feb2014\excel2

Example file 3: \\directory\Loaded\Feb2014\excel3

(帐号始终填写在 B 列中,第 1 到第 5 行作为标题)

使用上述示例所需的输出:

主文件夹(文件)|子文件夹 (Jan2014) |文件名 (excel1) |帐号计数

这可以使用 SAS 吗?

因此,如果这还不够信息,我已经在网上搜索并找到了使用批处理文件带回文件列表的方法,但没有什么可以计算观察结果。

【问题讨论】:

  • 我认为更简单的方法可能是在 SAS 导入中使用通配符,但为此我可以获得要导入的文件名吗?
  • 您是否有 ACCESS to PC FILES 许可(即,您可以从 excel 进行 proc 导入)吗?
  • 另外,工作表是否总是命名相同的东西(例如,SHEET1)还是会有所不同?它是可预测的吗?
  • 是的,我可以进行 proc 导入,并且所有文件的命名都不同,这与我想使用通配符的原因不同,但它们也在子目录中。即 2014 年 1 月将有 5 个 excel 文件,2014 年 2 月可能有 100 个 ect
  • 文件中的工作表是否命名不同,或者它们都是 Sheet1 还是其他? (文件/工作簿 = .xlsx 文件。工作表 = 工作簿中的选项卡。)

标签: excel sas vba


【解决方案1】:

SAS 解决方案是这样的。如果你做了所有的 libnames 然后设置所有的数据集,你可以让它更有效率,但是这段代码更容易一些,对于 500 我认为这是合理的。不幸的是,excel libnames 似乎不会为您计算行数,因此您不能只使用 dictionary.tables 来执行此操作。

如果工作表名称不同,您需要修改它以考虑到这一点,方法是设置一个宏变量来保存工作表名称(如果它以某种方式链接到文件名),或者通过宏查询 dictionary.tables 以查看 libname 中存在哪些表。

%let basedir=c:\temp;  *whatever the base directory is that all of your excel files are upstream from;
filename dirl pipe "dir /b/s &basedir.\*.xlsx";

data libnames;
infile dirl lrecl=1024 pad;
input
@1 filename $1024.;
run;

%macro get_rowcount(file=);
  libname _temp excel "&file.";
  data _rowcount;
  set _temp."Sheet1$"n end=eof;
  length file_name $1024;
  retain file_name "&file.";
  if eof then do;
    rowcount=_n_;
    output;
  end;
  keep rowcount file_name;
  run;

  proc append base=rowcounts data=_rowcount force;
  run;
%mend get_rowcount;

proc sql;
select cats('%get_rowcount(file=',filename,')') into :sheetlist separated by ' '
  from libnames;
quit;
&sheetlist.;

【讨论】:

  • Joe - 你能列出这需要工作的任何模块依赖项吗?谢谢
  • 这将在 Windows 桌面环境中工作,并获得 ACCESS to PC FILES 许可。在 Windows 服务器环境中,如果您的管理员启用了XCMD,这可能仍然有效。在非 Windows 环境中,该概念应该仍然可行,但需要修改目录命令以获得适当的系统命令(因此,在 Linux 中,ls 带有适当的标志),再次受限于XCMD,如果它是允许的服务器环境,并受制于拥有 PC 文件服务器(并修改 libname 以使用该方法)。
  • 我现在将所有 .xls 文件放在一个文件夹中,并使用 *.xls 作为通配符运行 proc 导入。虽然这适用于第一部分,但我还需要将文件名添加到使用 proc 导入创建的表中。这可能吗?
  • 您只需要解析该表中的完整路径文件名。您可以通过多种方式做到这一点 - 使用 SCAN(提示:-1 在单词列中的意思是“从右侧开始”)、使用正则表达式、查找和子字符串,任何您觉得最舒服的方式。
【解决方案2】:

我会为此使用 Powershell,除非您确实需要在 SAS 中执行此操作。 要将结果获取到 SAS,如果需要,您可以将数据从 powershell 保存到 excel 文件并导入到 SAS。

看看例如Get the Number of Rows in Column of a worksheet 作为首发。

【讨论】:

  • 我从未使用过 Powershell,查看上面的链接,我必须一次处理 1 个文件,这对于 500 多个文件是不可能的
  • 熟练的 PowerShell 用户可以编写脚本,以便它使用类似于我上面的答案的目录列表来对所有文件运行循环。 (我不是这样的用户,对不起!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
相关资源
最近更新 更多