检查 sas 中的外部 excel 数据集中是否存在一行

Check if a row exists in an external excel dataset in sas

大家早上好,

我是 sas 新手。我有一个 excel(例如销售额),其中每天插入一行(例如每天的销售额),我想做的是 运行 sas 中的一个宏,如果在excel叫sales,我没有前一天的记录,我在另一个叫check sales的table里打了个KO,比如

总而言之,我希望宏对 excel 数据集进行检查,如果没有包含昨天日期的记录,则执行 x 操作(在另一个 table 的列中插入一个 KO ) 如果有昨天的记录,继续

这是我试过的。我想看看 excel 中是否有昨天的记录 'DQ_Diario'

    %macro Macro_existe2; 
        %let myfiledq= /opt/sas/dfg/dfgd/dfgd/fgdgfd/DQ_DIARIO.xlsx;
        %put &myfiledq;
        %IF (%sysfunc(fileexist(&myfiledq))) and &vweek ne &weekfin %then %do;
            %put REVISAR: existe el fichero de &vday. y es una semana entregada;
        %end;
    %end;
    %mend Macro_existe2;
    %Macro_existe2; 

应该注意的是,函数中缺少 else 部分,但现在我很想知道如何检查 excel 数据集中是否有昨天的记录(昨天我有它定义为宏变量,所以昨天用 & 定义。这将是有效的)

到目前为止我的实现是它帮我检查某个路径下是否存在文件,但我现在需要的是检查文件中是否存在记录。

我希望我已经解释清楚了,非常感谢阅读这篇文章的每个人post。圣诞快乐

您需要将 XLSX 文件转换为数据集才能检查内容。因此您的宏将必须生成 SAS 代码。

您知道您要检查的工作簿中sheet作品的sheet名称吗?如果不是,PROC IMPORT 将只导入第一个 sheet,无论其名称如何。

数据是否采用矩形格式,以便轻松转换为数据集?或者您只想转换 KO 列。 KO 是 header 列还是 Excel 列引用?如果是这样,您的作品中真的有那么多专栏吗sheet?您可以使用 PROC IMPORT 的 RANGE 选项来只导入特定的单元格。

让我们简化示例,假设您要检查上一个日期的列标记为 DATE,因此将转换为名为 DATE 的变量。

%macro check_xlsx_date(filename,mvar=found);
%if not %sysmexist(&mvar) %then %global &mvar;
%let &mvar=0;

%if %sysfunc(fileexist(&filename)) %then %do;
proc import datafile="&filename" dbms=xlsx out=excel_sheet replace ;
run;

proc sql noprint;
  select max( date = (today()-1) ) into :&mvar trimmed
    from excel_sheet
  ;
quit;
%end;
%mend check_xlsx_date;

%check_xlsx_date(/opt/sas/dfg/dfgd/dfgd/fgdgfd/DQ_DIARIO.xlsx);
%put &=found;