PRO 的 DO 循环与多个 SAS 库进行比较

问题描述 投票:0回答:1

我有一个 Excel,其中包含一列文件和另一列包含文件夹路径。我想循环遍历文件路径并为它们分配库名称。

卓越:

file_name           file_path

file1.txt           filepath1
file2.sas7bdat      filepath1
file3.xlsx          filepath2
file4.txt           filepath3
file5.sas7bdat      filepath3

我找到了这个解决方案,但是,我有一些来自同一文件夹的文件,并且想将相同的库名称分配给相同的文件夹路径

data want;
set excel_table;
libref = 'LIBR' || put(_n_, Z4.);
rc = libname(libref, file_name,, "access=readonly');
if rc ne 0 then sysmsg = sysmsg();
run;

我可以添加“if.first.filepath...”类型的语句吗?

“file_name”列中的相同文件也都在另一个文件夹(文件夹 A)中。我最终想将“file_name”列中的文件与其他各个文件夹中的文件与文件夹 A 中的相同文件进行比较。我怎样才能首先循环遍历 libnames 和关联的文件进行 proc 比较?

proc compare base = "dynamic libname".file_name compare=folder2.filename;
run;
sas macros proc-sql
1个回答
0
投票

Libref 指向目录,而不是文件。因此,假设您有一个名为 HAVE 的数据集,其中包含这两列,那么您将希望为每个 FILE_PATH 而不是每个 FILE_NAME 创建一个 libref。 Libref 仅对访问数据集有用。

data ds_list;
  set excel_table;
  by file_path;
  where lowcase(scan(file_name,-1,'.') = 'sas7bdat';
  length libnum 8 libref $8 rc 8 sysmsg $200 ;
  if first.file_path then do;
    libnum + 1;
    libref = 'LIBR' || put(_n_, Z4.);
    rc = libname(libref, file_path,, 'access=readonly');
    if rc ne 0 then sysmsg = sysmsg();
  end;
run;

现在您已经定义了一个或多个库引用(重要的是,将生成的库引用名称存储到数据集中),您可以在 PROC COMPARE 代码中使用它们。

但是根本不清楚您想要将它们与哪些数据集进行比较。

© www.soinside.com 2019 - 2024. All rights reserved.