Древнее изречение "Разделяй и властвуй" используется в политике, социологии и психологии, главным образом для манипулирования людьми. Однако в последние два столетия этот принцип также был принят компьютерной наукой. Он широко используется в компьютерном программировании, прежде всего в компьютерных алгоритмах, таких как бинарный поиск, быстрая сортировка, быстрое преобразование Фурье, алгоритмы параллельной обработки и др.

Типичный алгоритм "Разделяй и властвуй" состоит из следующих шагов:

  1. "Разделяй" — разбить данную проблему на более мелкие части (подзадачи) того же типа;
  2. "Властвуй" — решать эти мелкие подзадачи;
  3. "Объединяй" — суммировать результаты решенных подзадач, чтобы получить результат исходной задачи.

Тем не менее в этой статье мы изменим принцип "Разделяй и властвуй" и перейдем от шага 3 к шагу 2: объединяй и властвуй.

В решении повседневных задач по программированию нам может не понадобиться разделить проблему, чтобы решить ее. Во многих случаях мы имеем дело с небольшими частями задачи (элементами языка), предоставляемыми языком программирования SAS, и мы решаем некоторые более крупные задачи, объединяя эти элементы.

Рассмотрим некоторые примеры.

Объединение форматов SAS

Предположим, что у вас есть переменная x в таблице SAS, к которой применяется следующее требование. В зависимости от значения переменной вам необходимо применять различные форматы SAS:

Другими словами, нужно отображать проценты, превышающие 10%, как целые числа; числа в процентах от 1% до 10% в виде чисел с одной десятичной точкой и числа в процентах, составляющие менее 1%, в виде чисел с двумя десятичными точками.

Вы можете обойтись инструкцией в формате proc с подходящим множителем — желаем удачи. К счастью, есть намного более удобный способ решить эту проблему. Знаете ли вы, что можно использовать уже существующие форматы в качестве меток в инструкции формата proc? Другими словами, мы можем объединять несколько форматов SAS при определении другого формата SAS.

Вышеупомянутая проблема легко решается путем определения нового пользовательского формата в виде сочетания различных форматов PERCENTw.d следующим образом:

proc format;
   value pctmod
      -0.01 <-< 0.01 = [percent10.2] 
      -0.1 - -0.01, 0.01 - 0.1 = [percent10.1]
      low -< -0.1, 0.1 <- high = [percent10.0]
      ;
run;

Вот что делает этот формат (неотформатированное значение – форматированное значение):

Вы можете комбинировать любые другие существующие форматы по мере необходимости, включая форматы смешивания и проверки соответствия SAS и пользовательские форматы. Вы даже можете использовать существующие форматы в инструкции PICTURE PROC FORMAT. Например, следующий пользовательский формат отформатирует значения в долларах от 0 до 1 в виде центов (например, 75¢), а значения в долларах больше 1 — в виде долларов (например, $9,340):

proc format;
   picture dolcent
	  0 <-< 1 = '99¢' (mult=100)
	  1 - high = [dollar32.0]
	  ;
run;

Вот что делает этот формат (неотформатированное значение – форматированное значение):

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

Использование существующего формата в определении формата может быть истолковано как вложение формата. Вложение первого уровня означает, что вы создаете формат A с форматом B в качестве отформатированного значения. Однако, если вы также создаете формат B с форматом C в качестве отформатированного значения, то вы получаете вложение второго уровня. Избегайте вложенных форматов с уровнем выше одного, так как требования к ресурсам могут резко возрастать с каждым дополнительным уровнем.

Объединение библиотек SAS

Предположим, что вы определили несколько библиотек данных SAS:

libname apples 'c:\projects\garden\apples';
libname oranges 'c:\projects\garden\oranges';
libname tomatoes 'c:\projects\garden\tomatoes';

Затем вы можете логически объединить их в одну библиотеку:

libname combolib (apples oranges tomatoes);

или

libname combolib ('c:\projects\garden\apples' 'c:\projects\garden\oranges' 'c:\projects\garden\tomatoes');

Да, вы можете объединять яблоки с апельсинами и даже с томатами, и это позволит вам получить доступ к наборам данных SAS в нескольких библиотеках с одной ссылкой на библиотеку (libref).

Как вы можете видеть, вы можете объединить две или более библиотеки по их ссылкам на библиотеки, по физическим именам или даже по сочетанию ссылок на библиотеки и физических имен, например:

libname combolib (apples oranges 'c:\projects\garden\tomatoes');

SAS так же позволяет использовать запятые между объединяемыми библиотеками:

libname combolib (apples, oranges, tomatoes);
libname combolib (apples, oranges, 'c:\projects\garden\tomatoes');

Важно знать, что, хотя SAS может объединять библиотеки, которые содержат файлы с одинаковыми именами, при ссылке на такой файл объединенные библиотеки проверяются по порядку и используется первое вхождение указанного файла.

Это оказывается чрезвычайно полезным, когда у вас есть несколько версий одинаковых таблиц, которые вы используете в разных средах во время цикла разработки системы. Например, у вас может быть таблица данных SAS с именем SALES в некоторых или во всех средах разработки, тестирования и рабочих средах. Вы можете определить ссылки на библиотеки для каждой среды, а также для ссылку на  библиотеку для объединенной среды:

libname devllib 'c:\projects\proj_x\devl';
libname testlib 'c:\projects\proj_x\test';
libname prodlib 'c:\projects\proj_x\prod';
libname lastlib (prodlib testlib devllib);

Затем, когда вы сошлетесь на свою таблицу как lastlib.SALES SAS вернет таблицу SALES из рабочей среды, если она существует; затем из тестовой среды, если она существует и, наконец, из среды разработки, если она существует. Эта логическая иерархия означает, что SAS вернет последнюю и самую большую версию таблицы SALES. Если вы хотите получить таблицу из определенной среды, сошлитесь на нее с помощью определенной ссылки: prodlib.SALES, testlib.SALES или devllib.SALES.

Объединение библиотек формата SAS

Для получения такого же приоритета версий, который был описан выше, мвы можете объединять библиотеки формата SAS с помощью системного параметра FMTSEARCH= :

options fmtsearch=(prodlib testlib devllib);

Это означает, что ваши форматы SAS будут храниться в каталогах с именем FORMATS в указанных выше библиотеках: prodlib.FORMATS, testlib.FORMATS, devllib.FORMATS.

Нужно помнить, что если не указано иначе, библиотеки WORK и LIBRARY по умолчанию имеют приоритет в порядке поиска форматов SAS. Поэтому приведенное выше выражение эквивалентно следующему:

options fmtsearch=(work library prodlib testlib devllib);

Если в fmtsearch = указаны библиотеки WORK и LIBRARY, то по порядок умолчанию не применяется, и порядок поиска соответствует указанному в выражении.

Оригинал статьи на английском