TRANWRD, TRANSTRN функции и макропеременные

Всем привет!

Не так давно я столкнулся с необходимостью замены некоторых символов в макропеременных. Например, задача записать в название файла текущее время в формате HHMM.


Как вы наверное знаете, это можно сделать несколькими способами.

Я решил сделать так:
%let time = %sysfunc(TIME(),hhmm.);

В этом случае мы получим результат в виде hh:mm. Всё было бы отлично, если бы не одно но: система MS Windows не приемлет в названии файлов символы типа " : ".

Попробуем заменить двоеточие на значок нижнего подчёркивания " _ ".
Воспользуемся функцией TRANWRD (можно и TRANSTRN), синтаксис которой следующий:
TRANWRD(источник, что меняем, на что меняем)
Описание функции можно найти на официальном сайте.

Вставляем эту функцию в макрокод, как если бы вставляли в обычный код:
%let time = %sysfunc(tranwrd(%sysfunc(TIME(),hhmm.), ":" , "_"));
Но он не сработал, и результат остался тем же в формате hh:mm.

Так в чём же дело?
А дело в следующем:

То есть, теперь код может выглядеть следующим образом:

%let time = %sysfunc(transtrn(%sysfunc(TIME(),hhmm.),: ,_));

или

%let time = %sysfunc(transtrn(%sysfunc(TIME(),hhmm.),%str(:) ,%str(_)));


На этом всё!
Спасибо за прочтение и до скорых встреч!

Ярлыки: ,