SAS宏转换月末日期时3月报'Literal contains unmatched quote'如何解决
问题原因
你自定义的mydatep格式输出结果自带首尾单引号,使用%SYSFUNC将格式化结果赋值给宏变量时,宏解析器会尝试匹配结果中的单引号。3月的对应月份缩写刚好触发SAS宏的边界解析bug,导致系统判定存在未闭合的引号,抛出异常。
解决方案
方案1:修改自定义格式(推荐)
取消格式模板内置的单引号,需要使用引号时手动用宏引用函数包裹,从根源避免特殊字符解析问题:
proc format; picture mydatep low-high = '%0d-%0b-%0Y' (datatype = date); * 移除模板前后的单引号; %macro test(cycle=); %let enddate = %str(%')%SYSFUNC(intnx(month, %SYSFUNC(inputn(&cycle., yymmn6.)), 0, e), mydatep.)%str(%'); %put &enddate.; %mend;
方案2:仅修改宏代码(适配原有格式)
用%QSYSFUNC替代%SYSFUNC接收格式化结果,函数会自动对引号等特殊字符做宏掩码,避免解析冲突,无需调整原有格式定义:
%macro test(cycle=); %let enddate = %QSYSFUNC(intnx(month, %SYSFUNC(inputn(&cycle., yymmn6.)), 0, e), mydatep.); %put &enddate.; %mend;
两种方案均可兼容所有月份的计算,原有输出格式不变。
内容的提问来源于stack exchange,提问作者Kenji
相关产品推荐
相关产品推荐

