Errors and Warnings
-
Довольно часто, при написании программ, в логе появляются различные сообщение типа NOTE, WARNING или ERROR. Давайте рассмотрим несколько из них:
-
NOTE: MERGE statement has more than one data set with repeats of BY values
- Возникает при слиянии датасетов, по не уникальному ключу. В данном случае слияние выполнится, но результат будет непредсказуемым. Способ решения данной проблемы – пересмотреть ключ, по которому происходит слияние датасетов, и при необходимости расширить его, путем добавления новых переменных, либо предварительно отобрать нужные записи из датасета, тем самым добиться его уникальности по заданному ключу.
-
NOTE: Numeric values have been converted to character values at the places given by
Или
NOTE: Character values have been converted to numeric values at the places given by
- Пожалуй одни из самых распространенных ошибок, возникает при использовании переменных разных типов данных (Numeric и Character одновременно), или попытки обработки функциями, которые предусмотрены для других типов данных.
Например:
Если мы будем обращаться к числовой переменной, как к текстовой, то возникает ситуация, что SAS, понимая, что мы ошиблись, сам меняет тип данных и производит заданные нами действия, но пишет предупреждение, о том, что он конвертировал тип данных.
-
NOTE: Invalid numeric data
- Эта ошибка схожа с предыдущей. Рассмотрим случай, когда ожидается числовая переменная, но по факту она символьная, например:
-
NOTE: Division by zero detected
- Тут все просто: деление на ноль запрещено даже в программировании. При таком варианте, результат для переменной останется пустым.
-
NOTE: Invalid argument to function
- Некорректное указание параметров функций.
В данном примере input пытается преобразовать переменную даты x по формату месяц, день и год. Но в значении переменной встречается для месяца значение 13, но 13-го месяца просто не существует. Эта ошибка и выявляет такие неточности.
-
NOTE: Mathematical operations could not be performed
- Эта ошибка возникает при некорректном задании определенных математический операций. В данном примере, мы пытаемся взять логарифм от отрицательного числа.
-
ERROR: Too many variables defined for the dimension(s) specified for the array variable.
- Возникает при определении массива, в данном примере объявлено 4 элемента массива, хотя по факту мы здесь задаем 5, во избежание данной проблемы, можно указывать {*} , при такой записи SAS сам определяет количество элементов в заданном массиве.
-
NOTE: At least one W.D format was too small for the number to be printed
- Предупреждение о том, что из-за наложенного формата на переменную, возникает проблема, что длина самой переменной может оказаться больше, чем формат на неё наложенный. Это приведет к тому, что переменная обрезается. В данном случае рекомендуется использовать формат best.
-
ERROR: There was 1 unclosed DO block.
- Данная ошибка является следствием некорректного использования оператора do, например если открыть и не закрыть цикл.
-
ERROR: Format was not found or could not be loaded
- При попытке наложения несуществующего формата на переменную. Решение этой проблемы, заключается в пересмотре корректности заданного формата, и переменной, на которую вы пытаетесь наложить этот формат. Объявление форматов должно быть ДО их использования в датастепе.
-
WARNING: The variable text in the DROP, KEEP, or RENAME list has never been referenced.
- Возникает при попытке использования keep, drop или rename на переменные из датасета, в котором этих переменных попросту нет. В данном примере переменной TEXT просто не существует, она нигде не определялась до этого шага.
-
NOTE: Missing values were generated as a result of performing an operation on missing values. Each place is given by: (Number of times) at (Line):(Column).
- Данная ошибка возникает при обработке переменной, которая в некоторых случаях принимает пустые значения
Примеры синтаксических ошибок:
- Не указана точка с запятой, после data check:
- Открыт датасет, который пытаетесь обработать, т.к. SASу нужно перезаписать данные в датасете, но он не может получить к нему доступ, из-за того что он уже открыт на просмотр:
- Пропущен Арифметический оператор. В данном случае знак =
В Любом из вышеперечисленных случаев, в Логе появится сообщение типа NOTE, WARNING или ERROR.
А также, будет описана ошибка и даже подчеркнуто место в вашем коде, где она возникла.
Её ни в коем случае нельзя игнорировать!