Ответ зависит от непредоставленной информации. Ответ B - лучший выбор в том смысле, что вы должны использовать модификатор двоеточия при использовании информаторов в операторе INPUT, чтобы предотвратить использование форматированного режима ввода вместо режима ввода списка. В противном случае отформатированный ввод может прочитать слишком много или слишком мало символов, а также может оставить курсор в неправильном месте для чтения следующего поля.
Но если вы попытаетесь прочитать эти данные с линейных карт, это будет работать нормально для этих двух строк. Это связано с тем, что строки данных в строке дополняются до следующего кратного 80 байтам.
Если вы поместите эти строки в файл без пробелов в строках, то вторая строка завершится неудачно, потому что нет 10 символов для читать для последнего поля. Но если вы добавите опцию TRUNCOVER (или PAD) в оператор INFILE, то это сработает.
Попробуйте сами. TEST1 и TEST3 работают. TEST2 получает сообщение LOST CARD.
data test1;
input name $ hired date9. age state $ salary comma10.;
format hired date9.;
cards;
Donny 5MAR2008 25 FL $43,123.50
Margaret 20FEB2008 43 NC 65,150
;
options parmcards=test;
filename test temp ;
parmcards;
Donny 5MAR2008 25 FL $43,123.50
Margaret 20FEB2008 43 NC 65,150
;
data test2;
infile test;
input name $ hired date9. age state $ salary comma10.;
format hired date9.;
run;
data test3;
infile test truncover;
input name $ hired date9. age state $ salary comma10.;
format hired date9.;
run;
С другими данными первый форматированный ввод может также вызвать проблемы. Например, если бы значения даты использовали только 2 цифры для года, это отбросило бы все. Поэтому он пытается прочитать FL как возраст, а затем читает первые 8 символов зарплаты как STATE и просто пропускает как SALARY.
data test1;
input name $ hired date9. age state $ salary comma10.;
format hired date9.;
cards;
Donny 5MAR08 25 FL $43,123.50
Margaret 20FEB2008 43 NC 65,150
;
Результаты:
Obs name hired age state salary
1 Donny 05MAR2008 . $43,123. .
2 Margaret 20FEB2008 43 NC 65150