SAS Подстрока внутри макроса - PullRequest
0 голосов
/ 13 мая 2019

У меня есть пример кода, который работает на шаге данных (вне макроса), но не работает, когда я пытаюсь преобразовать его в макрос.Я пробовал разные типы способов сделать это с помощью 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;

По сути, я пытаюсь подстраивать варианты «-0» из другой строки, такой как 65-03, и удалять 03. Но это также более общий характер, поэтому он может работать, если65-003 и 65-0003 и т. Д.

1 Ответ

0 голосов
/ 13 мая 2019

Если вы хотите преобразовать значения, такие как примеры 65-003 и 65-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);
...