SAS числовой информатор против длины - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь определить, как SAS читает оператор length, а затем оператор informat.Я мог бы неправильно понять, но у меня сложилось впечатление, что оператор informat для числовых переменных работает так:

informat number 5.;

Это даст переменной число informat5, позволяя заполнить 5 цифр.EG 12345

Однако, когда я запускаю приведенную ниже программу, у меня есть номер, который имеет 9 цифр, 987654321, с соответствующей длиной, чтобы соответствовать цифрам, 6, которая будет представлять все числадо 137,438,953,472

В: оператор длины переопределяет оператор informat и позволяет всем 9 цифрам заполнить переменную число ?Как все 9 цифр вписываются в переменную число с informat из 5.?

data tst;
input number;
length number 6;
informat number 5.;
datalines;
987654321
;
run;

proc print data=tst;
run;

На основе этой документации SAS: http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000199348.htm

w указывает ширину поля ввода.Диапазон: 1-32

Казалось бы, informat w.d будет работать, как я описал вначале, и не позволит всем 9 цифрам заполнить число

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

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

Для числовых переменных информаторы работают не совсем интуитивно. Я не уверен почему - но они этого не делают.

См. Эту цитату из входной документации списка :

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

Они в некоторой степени слушают информат - добавьте туда .2, и вы получите принудительное десятичное число - но они не слушают, как долго следует читать значение. Я не уверен почему; кажется интуитивным, что они должны, но они этого не делают.

Вот с символьными переменными - они учитывают длину, но игнорируют информацию:

data tst;
length number $9;
informat number $5.;
input number;
datalines;
987654321
;
run;

proc print data=tst;
run;

Хотя вам нужно поставить информацию перед оператором ввода (и длиной для числовых переменных).

Более подробная информация доступна на странице документации для INFORMAT :

Как SAS обрабатывает переменные, когда вы присваиваете информацию с помощью инструкции INFORMAT

Информаторы, связанные с переменными с помощью инструкции INFORMAT, ведут себя как информаторы, которые используются с измененным вводом списка. SAS считывает переменные, используя функцию сканирования ввода списка, но применяет информацию.

В измененном вводе списка, SAS не использует значение w в информате для указания позиций столбцов или ширины поля ввода во внешнем файле использует значение w в информате, чтобы указать длину ранее неопределенных символьных переменных игнорирует значение w в числовых информаторах использует значение d в информате так же, как это обычно делается для числовых информаторов пропуски, встроенные в качестве входных данных, рассматриваются как разделители, если только вы не измените их состояние с помощью спецификации опции DLM = или DLMSTR = в инструкции INFILE.

Это гораздо более очевидно в том факте, что SAS игнорирует значение w.

0 голосов
/ 16 мая 2018

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

Кроме создания метаданных в наборе данных SAS, нет особой ценности в присоединении таких переменных, как 5. или $10. к переменным.

  • SAS не нужно, чтобы они понимали, как преобразовывать текст в значения, в отличие от таких сведений, как date..
  • В режиме списка игнорируется часть ширины.
  • А в форматированном вводе, где ширина имеет значение, вы должны указать информацию в самом операторе INPUT.
0 голосов
/ 16 мая 2018

длина переменной определяет объем пространства, занимаемого значением при сохранении на диск. ПРИМЕЧАНИЕ. Во время выполнения шага DATA все числовые значения имеют двойную точность, усечение до длины <8 происходит только во время вывода. </em>

informat является отдельной концепцией от length . Informat определяет, как представления входящего значения должны интерпретироваться для хранения как числовое значение SAS. Представления входящего значения будут тем, что когда-либо должен обрабатываться текст; будь то оператор INPUT, читающий файл, редактирование поля VIEWTABLE, обработка введенного значения, редактирование ячейки сетки EG и т. д. *

Формат также является отдельной концепцией, которая определяет, как SAS отображает числовое значение для вывода; будь то оператор PUT, визуализация строки VIEWTABLE, размещение в выходных данных PROC, ячейка сетки EG и т. д. *

Объяснение

Теперь, когда это не так, информат учитывается, когда это явно указано в операторе INPUT:

data _null_;
  attrib number length=6 informat=5.;
  input number 5.;
  put 'NOTE: ' number=;
  datalines;
987654321
run;
===== LOG ===== 
NOTE: number=98765

И, как вы спрашиваете, переменные, связанные с informat не применяются, явная числовая информация не указывается

data _null_;
  attrib number length=6 informat=5.;
  input number;
  put 'NOTE: ' number=;
datalines;
987654321
run;
===== LOG =====
NOTE: number=987654321

Таким образом, первый - это LIST-ввод с указанным форматом, а второй - простой LIST-ввод (поскольку формат не указан).

Простой ввод в список примет некоторые нелепо большие данные, и результирующее значение, хотя и не является точным в хвостовой части, будет на правильном экспоненциальном уровне.

data _null_;
  attrib number length=6 informat=5.;
  input number;
  put 'NOTE: ' number= ;
datalines;
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
run;
===== LOG =====
NOTE: number=1.2345679E89

Что говорят документы для оператора INPUT, список ? Конечно, ничего о с использованием переменных, объявленных informat, когда ни одна не указала

Простой ввод списка

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

• По умолчанию хотя бы один пробел должен отделять входные значения. использование опция DLM = или DLMSTR = или опция DSD в инструкции INFILE указать разделитель, отличный от пробела.

• Представлять каждое пропущенное значение точкой, а не пробелом или двумя Смежные разделители.

• Значения ввода символов не могут быть длиннее 8 байт, если только переменной дается более длинная длина в более ранней длине, ATTRIB или ИНФОРМАТ, заявление.

• Символьные значения не могут содержать встроенные пробелы, если вы не измените разделитель.

• Данные должны быть в стандартном числовом или символьном формате. (сноска 1)

СНОСКА 1: См. Справочник по языку SAS: Концепции для получения информации о стандартных и нестандартных значениях данных. (мой LOL)

Понятия для «переменных переменных SAS»:

информ

относится к инструкциям, которые SAS использует при чтении значений данных. Если информация не указана, информация по умолчанию - w.d для числового переменная и $ w. для символьной переменной. Вы можете назначить SAS информатирует переменную в операторе INFORMAT или ATTRIB. Вы можете используйте процедуру FORMAT, чтобы создать собственный информат для переменной.

(мой жирный)

Очевидно, что нет явного значения по умолчанию, такого как 32. или best32. потому что значения с более чем 32 цифрами будут введены без ошибок.

Так что документация объясняет вещи? Да, хорошо, Сорта. Что взять с собой:

  • Человеческая интуиция числовой переменной, наследующей ее информацию при простом вводе списка не выравнивает с фактическим реализованным поведением .
    • Тектоническое количество существующего кода SAS означает, что изменение для реализации этой интуиции крайне маловероятно
  • Простые утверждения могут включать в себя множество концепций с обширной документацией
  • Возможное изменение в том, что документация будет обновлена, чтобы быть более точной в отношении простых предостережений при вводе списка
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...