2017-02-08 10 views
1

Я готовлю тест SAS BASE. В главе 17 тестовой книги, в которой читаются данные в формате Free-format, приведен пример того, как читать значения символов со встроенными записями и нестандартным значением, например номерами с запятой. Я тестировал его, и его результат не соответствует описанию книги.измененный список ввода, когда значение символа имеет встроенные заготовки

data cityrank; 
infile datalines; 
input rank city & $12. pop86: comma.; 
datalines; 
1 NEW YORK 7,262,700 
2 LOS ANGELES 3,259,340 
3 CHICAGO 3,009,530 
4 HOUSTON 1,728,910 
5 PHILADELPHIA 1,642,900 
6 DETROIT 1,086,220 
7 DAN DIEGO 1,015,190 
8 DALLAS 1,003,520 
9 SAN ANTONIA 914,350 
; 

что я получил, как показано ниже, набор данных имеет 4 общ.

rank city   pop86 
1 NEW YORK 7,2 2 
3 CHICAGO 3,00 4 
5 PHILADELPHIA 6 
7 DAN DIEGO 1, 8 

Я не прав, когда-то печатал программу? Я проверял снова и снова, что я копирую его правильно.

Как изменить эту программу?

Спасибо!

+0

Я думал, по крайней мере, Филадельфия может получить правильное значение Pop86, но до сих пор нет. не понимаю, почему для этого города. другие, потому что длина символов - 12. Очень интересно. – Lin

ответ

0

Я догадываюсь из опечаток, которые вы не скопировали, вставьте это, но вместо этого вы набрали его.

Таким образом, вы (или авторы книг) сделали еще одну опечатку: есть два пробелов после названий городов, а не один (или, по крайней мере, должен быть). Это то, что делает &: он говорит «подождите двух последовательных разделителей» (позволяя игнорировать один разделитель, поэтому New York считывается в одну переменную вместо разделения).

Так что это было бы правильно:

data cityrank; 
infile datalines; 
input rank city & $12. pop86: comma.; 
datalines; 
1 NEW YORK 7,262,700 
2 LOS ANGELES 3,259,340 
3 CHICAGO 3,009,530 
4 HOUSTON 1,728,910 
5 PHILADELPHIA 1,642,900 
6 DETROIT 1,086,220 
7 SAN DIEGO 1,015,190 
8 DALLAS 1,003,520 
9 SAN ANTONIO 914,350 
; 
run; 
+0

Спасибо, Джо! Вы правы, и книга действительно говорит, что так, два или более последовательных разделителя. Теперь это работает, как описывает книга. – Lin

+0

Но мне все еще интересно в реальном мире, что делать, если исходные данные в моем первом сообщении существуют. что мы должны делать, чтобы правильно читать записи? Спасибо! – Lin

+0

В реальном мире у вас не было бы хорошего решения без большой работы, потому что нет очевидного способа рассказать о том, что «NEW YORK» - это одно поле. Вероятно, вам придется выполнить некоторую предварительную обработку, которая бы определила, что наивное чтение будет помещать «YORK» в числовое поле, а затем процитировать поле («NEW YORK» тогда, если вы используете опцию DSD, читайте как одно поле). Но в реальных сценариях, которые часто очень грязные. – Joe