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

Всем привет!

Не так давно я столкнулся с необходимостью замены некоторых символов в макропеременных. Например, задача записать в название файла текущее время в формате 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(_)));

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

Добавить комментарий

Войти с помощью: 

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.