Чтение набора данных в SAS, где длина столбца неодинакова

#sas

#САС

Вопрос:

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

 data test;  infile datalines dlm="*" dsd truncover;  input ID Store$ Date mmddyy10. Amount Code Color$;  datalines;  14528*instore*06/15/2008*215.65**red 14529*online*06/15/2008*183.98*1650039*white 14530**06/16/2008*107.50*1650450*green 14531*instore*06/17/2008*350.78*1652903*graphite ;  run;   

Комментарии:

1. Оператор INFORMAT не обязательно должен быть перед оператором ВВОДА.

2. @Том Действительно, я отредактировал свой ответ. Единственное отличие состоит в том, что с информацией перед оператором ввода столбец даты будет первым столбцом в наборе данных.

3. Да, SAS определит переменные в том порядке, в котором они будут отображаться на этапе обработки данных. Он также определит тип и длину переменной в том месте, где переменная используется в первую очередь, когда требуется эта информация. Как инструкции informat, так и инструкции input-это те, которые заставят SAS определить тип и длину переменной.

Ответ №1:

Вам необходимо использовать ввод в режиме СПИСКА, чтобы позволить оператору ввода использовать разделители для определения того, какую часть строки следует читать для каждой переменной. Вы используете РЕЖИМ СПИСКА для большинства переменных во ВХОДНОМ операторе, но вы перешли в ФОРМАТИРОВАННЫЙ режим для переменной ДАТЫ, потому что вы включили спецификацию INFORMAT в строку во ВХОДНОМ операторе.

Когда оператор ВВОДА считывает переменную в ФОРМАТИРОВАННОМ режиме, он считывает точно количество символов, требуемое спецификацией informat. Если длина следующей строки не в точности соответствует количеству символов, требуемому информатом, это означает, что он может прочитать слишком много символов или слишком мало.

Вы можете использовать : модификатор после переменной ДАТЫ, чтобы указать оператору ВВОДА использовать спецификацию informat, включенную в инструкцию ВВОДА, но все равно анализировать строку в РЕЖИМЕ СПИСКА. Обратите внимание, что при чтении переменной в РЕЖИМЕ СПИСКА ширина спецификации informat игнорируется для чтения. Вместо этого оператор ВВОДА будет считывать все символы в следующем «слове» независимо от его ширины.

 input ID Store $ Date :mmddyy. Amount Code Color $;  

Вы также можете прикрепить информацию к переменной ДАТЕ с помощью инструкции INFORMAT и удалить спецификацию informat из инструкции ВВОДА. Не имеет значения, является ли оператор INFORMAT до или после оператора ВВОДА, поскольку оператор INFORMAT является неисполняемым оператором.

 input ID Store $ Date Amount Code Color $;  informat date mmddyy.; format date date9.;   

Ответ №2:

Вам не хватает модификатора двоеточия : для чтения даты. Он позволяет считывать нестандартные значения данных и значения символов длиной более восьми символов, но без встроенных пробелов.

 data test;  infile datalines dlm="*" dsd truncover;  input ID Store $ Date :mmddyy10. Amount Code Color $;  datalines; 14528*instore*06/15/2008*215.65**red 14529*online*06/15/2008*183.98*1650039*white 14530**06/16/2008*107.50*1650450*green 14531*instore*06/17/2008*350.78*1652903*graphite ; run;  Result:  id store date amount code color  14528 instore 17698 215.65 . red  14529 online 17698 183.98 1650039 white  14530 17699 107.5 1650450 green  14531 instore 17700 350.78 1652903 graphite  

Поскольку хранилище является символьной переменной, отсутствующее значение будет представлено *blank* . в виде замены числового значения (кода).

PS: Вместо : модификатора вы также можете использовать оператор INFORMAT до или после оператора ВВОДА:

 data test;  infile datalines dlm="*" dsd truncover;  informat date mmddyy10.;  input ID Store$ Date Amount Code Color $;  datalines; 14528*instore*06/15/2008*215.65**red 14529*online*06/15/2008*183.98*1650039*white 14530**06/16/2008*107.50*1650450*green 14531*instore*06/17/2008*350.78*1652903*graphite ; run;