【问题标题】:SAS Substringing inside of a macro宏内部的 SAS 子字符串
【发布时间】:2019-09-30 19:05:13
【问题描述】:

我有一个在数据步骤(宏之外)中工作的示例代码,但是当我尝试将其转换为宏时它不起作用。我尝试了不同类型的方法来使用 CALL SYMPUTS、SYSFUNC、LET 等。下面列出的代码是我试图将其放入输入 T_Test2 的宏中的代码。

DATA asdhjkl;
    SET T_Test2;
    IF INPUT(SCAN(COL1, 1, "-"), best.)=0 THEN COL1=SUBSTR(COL1, INDEX(COL1,"-")+1);
    string="-00000000000000000000";
    DO I = 1 TO 20;
        COL1 = TRANWRD(COL1, trim(string), " ");
        string = substr(string, 1, length(string)-1);
        PUT string;
    END;
    COL1=COMPRESS(COL1);
RUN;

基本上我要做的是从另一个字符串(例如 65-03)中取出“-0”的子字符串变体并删除 03。但它也更通用,因此如果它是 65-003 和 65- 则它可以工作0003等

【问题讨论】:

  • 请添加示例输入数据和预期结果。还要解释你打算如何在宏中使用它。如果您知道这行得通,为什么不让宏生成您已经展示过的相同 SAS 代码?
  • 所以你的字符串可以分成由连字符分隔的部分?每个字符串可以有多少个部分?它总是两部分吗?可以将每个单独的部分转换为整数吗?或者它们可以包含非数字字符吗?任何部分都可以超过 15 位吗?

标签: macros sas


【解决方案1】:

如果您希望将 65-00365-003 示例中的值转换为 65-3,那么您的程序太复杂了。您可以将第二部分转换为数字,然后生成字符串。或者,您可以使用正则表达式将后跟一个或多个零的连字符转换为一个连字符。

这是两种方法的数据步骤代码解决方案:

data test;
  input have $20. ;
  length want1-want2 $20;
  want1=catx('-',scan(have,1,'-'),input(scan(have,2,'-'),32.));
  want2=prxchange('s/-0*/-/',-1,have);
cards;
65-003
65-0003
;

或者您可以在宏代码中执行类似的操作来操作宏变量的值。 %eval() 函数使用整数运算评估看起来像表达式的字符串,因此添加 + 会使 003 看起来像要评估的表达式。

%macro fix1(string);
%scan(&string,1,-)-%eval(+%scan(&string,2,-))
%mend fix1;

%macro fix2(string);
%sysfunc(prxchange(s/-0*/-/,-1,%superq(string)))
%mend fix2;

%put %fix1(65-003);

【讨论】:

  • 如果可以,您能解释一下第一个宏是如何工作的吗?就像它是如何工作的一样。另外,您将如何使这些宏起作用,因为如果我尝试在其中输入任何尝试,它会吐出“语句无效或使用顺序不正确。”
  • 我添加了一个示例用法。该宏只发出字符串,因此在您可以使用字符串的任何其他地方使用这些字符串,例如 %let 或在双引号内作为 SAS 语句的一部分..
猜你喜欢
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
相关资源
最近更新 更多