Всем привет!
Не так давно я столкнулся с необходимостью замены некоторых символов в макропеременных. Например, задача записать в название файла текущее время в формате HHMM.
Как вы наверное знаете, это можно сделать несколькими способами.
Я решил сделать так:
%let time = %sysfunc(TIME(),hhmm.);
В этом случае мы получим результат в виде
hh:mm. Всё было бы отлично, если бы не одно но: система MS Windows не приемлет в названии файлов символы типа
" : ".
Попробуем заменить двоеточие на значок нижнего подчёркивания "
_ ".
Воспользуемся функцией TRANWRD (можно и TRANSTRN), синтаксис которой следующий:
TRANWRD(источник, что меняем, на что меняем)
Описание функции можно найти на
официальном сайте.
Вставляем эту функцию в макрокод, как если бы вставляли в обычный код:
%let time = %sysfunc(tranwrd(%sysfunc(TIME(),hhmm.), ":" , "_"));
Но он не сработал, и результат остался тем же в формате
hh:mm.
Так в чём же дело?
А дело в следующем:
- В макрокоде нет необходимости использовать кавычки, а если они стоят, то они будут считаться частью текста. То есть, ":" - это 3 символа, которых нету в значении времени, а значит и нечего заменить.
- Если есть необходимость заменить пробел, то в этом случае приходит на помощь %STR(letter), где на месте letter будет стоять пробел или любой другой символ, который необходимо заменить.
То есть, теперь код может выглядеть следующим образом:
%let time = %sysfunc(transtrn(%sysfunc(TIME(),hhmm.),: ,_));
или
%let time = %sysfunc(transtrn(%sysfunc(TIME(),hhmm.),%str(:) ,%str(_)));
На этом всё!
Спасибо за прочтение и до скорых встреч!