2016-02-07 2 views
0
data test; 
    infile cards dsd dlm=', .'; 
    input stmt : $ @@; 
    cards; 
    T 
    ;run; 
/*-----------------------------------------------*/ 
    data test; 
    infile cards dsd dlm=', .'; 
    input stmt : $ @@; 
    cards; 
    Th 
    ;run; 
/*-----------------------------------------------*/ 
    data test; 
    infile cards dsd dlm=', .'; 
    input stmt : $ @@; 
    cards; 
    This is SAS. 
    ;run; 

При первом запуске программы, 80 наблюдений создаются При втором запуске программы, 79 наблюдений создаются Когда третья программа запущена, 72 наблюдение созданоПочему эти многочисленные наблюдения создаются в следующей программе?

Я знаю, что это программа имеет худший стиль программирования. Неправильные настройки заданы для неправильной техники. Параметр DSD установлен, двойной трейлинг-оператор @@ (держатель строки), используется модификатор Colon (:) и используется более 1 делит, что является наихудшим программным обеспечением SAS.

Помимо этого, я хочу знать, почему создано так много наблюдений, почему 80? 79? как выполняется программа? Я думаю, что выбор DSD & 2 метрических шкалы имеют большое влияние. Может ли кто-нибудь объяснить?

+0

Я не думаю, что нет ничего плохого в комбинации входной_файл и Оператор ввода параметров. Вы не нуждаетесь в модификаторе двоеточия, поскольку вы не используете встроенный формат, а только один - не в формате, но ваша программа работает одинаково в любом случае. Хотя комбинация параметров может показаться странной и с фиксированными записями, которые вы получаете, и неожиданным количеством наблюдений я не вижу ничего, чтобы сделать его худшей программой. –

+0

@data_null_ Я чувствовал себя так, потому что никто не использовал эти многие параметры, чтобы просто прочитать один символ ... :) –

ответ

1

Причина, по которой вы получаете больше записей, чем вы ожидаете, состоит в том, что CARDS фиксированные записи длины. Причина, по которой вы получаете разное количество записей, состоит в том, что после чтения ненулевого поля (ов) осталось другое количество нулевых полей. Вы можете увидеть это, добавив параметр COL в инструкцию INFILE, чтобы показать вам, где указатель столбца после чтения каждого поля. Col = 3, 4, 13

data test; 
infile cards dsd dlm=', .' col=c; 
input stmt : $ @@; 
col=c; 
cards; 
T 
;run; 
proc print data=test(obs=5); 
/*-----------------------------------------------*/ 
data test; 
infile cards dsd dlm=', .' col=c; 
input stmt : $ @@; 
col=c; 
cards; 
Th 
;run; 
proc print data=test(obs=5); 
/*-----------------------------------------------*/ 
data test; 
infile cards dsd dlm=', .' col=c; 
input stmt : $ @@; 
col=c; 
cards; 
This is SAS. 
;run; 
proc print data=test(obs=5); 
run; 

enter image description here

+0

вы упомянули, что «различное количество нулевых полей осталось после чтения ненулевого поля (ов)» .. почему его около 80 .... в карточках нет нулевых полей ... только 1 или 2 символа ... Я думаю, что входной буфер принимает размер записи по умолчанию как 80. Как вы думаете? –

+0

У вас много нулевых полей каждое пространство (одно из ваших разделителей) определяет пустое поле. Да, входной буфер равен 80 для ввода CARDS (большая часть fime), источник всех этих нулевых полей. В качестве альтернативы вы можете использовать PARMCARDS для данных In-Stream, SAS поместит данные в потоке в файл, определенный FILEREF, названный в параметре системы PARMCARDs (по умолчанию FT15F001), который можно прочитать с помощью RECFM = V, чтобы получить результат, который вы ожидать. –