Лекция 3. Программирование на языке SAS. Основы шага DATA (1185375), страница 2
Текст из файла (страница 2)
версии PUT и INPUT• Явно преобразовать типы переменнойв наборе данных можно «переписав»переменную на шаге Data:25Валидация форматов• Если в input не может быть применен входной формат, то:• Пишется сообщение в журнал• Генерируется ошибка _error_=1• Значение целевой переменной становится – пропуск• Результат: rate=.
_ERROR_=1 _N_=1• Можно отключить генерацию сообщения в журнале и ошибкучерез ?? или ?:• Результат: rate=. _ERROR_=0 _N_=1, а если использовать один ?, тоошибка генерируется, а запись в журнал нет26Контроль целостности• Идея как в реляционных СУБД:• Задать ограниченя, которые должны всегда выполнятся в наборе данных• Делается через PROC DATASET:PROC DATASET LIBRARY=libref;MODIFY member;IC CREATE name=CHECK(WHERE=condition));RUN;• Например:27Чтение набора данных SAS с помощьюоператора SETВвод-выводпамятьВвод:SASДанныеКэшPDVВывод:данныеSASВвод-вывод...Чтение внешних файловВвод-выводВвод:необработанныеданныеБуфер вводаБуферыКэшпамятьPDVВывод:данныеSASВвод-выводБуферыДанныепреобразуютсяиз внешнегоформатав форматSAS.Работа с внешними файлами• Пока мы работали с наборами данных в формате SAS• Внешние файлы:••••Текстовые с фиксированным размером столбцовСложно структурированные текстовые файлыТекстовые с разделителямиБинарные файлы• Операции• Чтение:• Запись:DATA output-SAS-data-set;INFILE 'raw-data-file-name’;INPUT specifications;<additional SAS statements>RUN;DATA _NULL_;FILE 'raw-data-file-name’;PUT specifications;<additional SAS statements>RUN;30Замечания про работу с внешними файлами Файлы можно читать с очень разных устройств, в том числе: PIPE, SOCKET, HADOOP, WEBDAV, FTP и т.д., например:INFILE dummy ftp user='myuid' pass='xxxx' filevar=file_to_read; Можно задавать кодировку и другие параметры Работает много опций стандартных наборов данных: OBS, END и другие В переменной _infile_ лежит текущий буфер Можно работать (читать/писать) с несколькими файлами сразу: задав несколько INFILE или FILE, и даже переключая их «на лету» с помощью опции FILEVAR:Чтение данных с помощью форматированноговводаОбщий формат оператора INPUT с форматированным вводом:INPUT pointer-control variable informat .
. . ;Форматированный ввод используется для чтения значений данныхпосредством: перемещения указателя ввода в начальную позицию для чтенияполя; присвоения имени переменной; указания входного формата (также определеят ширину поля)Пример.input @5 FirstName $10.;@nперемещает указатель в n символ.+nперемещает указатель на n символов.Пример спецификации INPUTОпределяется начальная позиция, имя переменной и входной форматдля каждого поля ввода.Структура: offers.datОписаниеФрагмент файла offers.datСтолбецТип клиента1–4Дата предложения5–12Группа позиции14–21Скидка22–2411221---5----0----5----0----5104012/02/07 Outdoors15%202010/07/07 Golf103009/22/07 Shoes7%10%103009/22/07 Clothes 10%202007/08/07 Clothes 15%203007/08/07 Clothes 25%input @1 Cust_type 4.@5 Offer_dt mmddyy8.Выполнение: форматированный вводЗаполняется оператором INPUT на каждойитерации цикла чтения наблюдений12Буфер ввода1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 53 0 1 0 0 5 / 1 7 / 0 7C l o t h e s1 5 %Инициализируется на основе специфиации INPUTPDVCust_typeN 83010Offer_dtItem_gpN 8$ 817303 ClothesDiscountN 8.15Несколько операторов INPUT для работы сосложно структурированными файламиПо умолчанию SAS загружает новую запись в буфер ввода, когда встречаетоператор INPUT (не очищая PDV)Можно ввести несколько операторов INPUT в одном шаге DATA.DATA SAS-data-set;INFILE 'raw-data-file-name’;INPUT specifications;INPUT specifications;<additional SAS statements>RUN;1121---5----0----5----0----5Ms.
Sue Farr15 Harvey Rd.Macon, GA31298869-7008Пример:2Dr. Kay B. Cox163 McNeil Pl.Kern, CA483-332193280Сложно структурированные файлы иусловная обработка записей при чтенииsales.dat• Пример• Казалось бы все просто:112231---5----0----5----0----5----0101USA 1-20-2007 3295.503034 EUR 30JAN2007 1876,30101USA 1-30-2007 2938.00128USA 2-5-20072908.741345 EUR 6FEB20073145,60109• Но не работает!!!!SaleID1011011345USA 3-17-2007 2789.10LocationSaleDateAmountUSAUSAEUR.17202..2908.74278910.00• Почему? INPUT «переводит строку», перечитывая буфер36Одиночный конечный символ @Одиночный конечный символ @ сохраняет запись необработанных данных вбуфере ввода, пока SAS выполняет одно из следующих действий: выполняет оператор INPUT без конечного @; начинает следующую итерацию шага DATA.Общий формат оператора INPUT с одиночным конечным @:INPUT specifications … @;Предыдущий пример теперь работает:SaleID10130341011281345109LocationSaleDateAmountUSAEURUSAUSAEURUSA1718617196171961720217203172423295.501876.302938.002908.743145.602789.10Чтение текстовых файлов с разделителями• Разделителем по умолчанию является пробел.• В оператор INFILE можно добавить параметр DLM=, чтобы задать другойразделитель, например запятую, табулятор DLM=’09’x и даже несколькосимволов для одного разделителя;• Общий синтаксис шага DATA для использования ввода списка для чтенияфайлов с данными, разделенными запятыми:DATA output-SAS-data-set;LENGTH variable(s) $ length;INFILE 'raw-data-file-name' DLM=',';INPUT variable-1 <$><variable-2 <$>…variable-n>;<additional SAS statements>RUN;• Могут возникать следующие проблемы пропущенные данные в конце записи; пропущенные данные «внутри» записи, представленные последовательнымиразделителями; несколько наблюдений в одной записи.Пропущенные значения в конце записиПо умолчанию, если в конце строки есть пропущенные данные, тоSAS выполняет следующие действия: загружает следующую запись в буфер, чтобы завершить наблюдение; записывает примечание в журнал.Пример:phone.csv112233441---5----0----5----0----5----0----5----0----5James Kvarniq,(704) 293-8126,(701) 281-8923Sandrina Stephano,(919) 871-7830Cornelia Krahl,(212) 891-3241,(212) 233-5413Karen Ballinger,(714) 344-4321Elke Wallstab,(910) 763-5561,(910) 545-3421В некоторых строкахданных отсутствуетномер мобильноготелефона.Параметр MISSOVERПараметр MISSOVER отключает загрузку новой записи, когда достигнут конецтекущей записи (по умолчанию FLOWOVER – продолжает читать файл, чтобызаполнить буфер)Общий формат оператора INFILE с параметром MISSOVER:INFILE 'raw-data-file' MISSOVER;Если достигнут конец строки, но не найдены значения для всех полей, топеременные без значений задаются как пропущенные.Пример:NameJames KvarniqSandrina StephanoCornelia KrahlKaren BallingerElke WallstabPhone(704)(919)(212)(714)(910)293-8126871-7830891-3241344-4321763-5561Mobile(701) 281-8923(212) 233-5413(910) 545-3421Идущие подряд разделителиПо умолчанию два или более идущих подряд разделителей в вводе спискаобрабатываются как один разделитель, а не как пропущенное значение.Пример: phone2.csv112233441---5----0----5----0----5----0----5----0----5James Kvarniq,(704) 293-8126,(701) 281-8923Sandrina Stephano,, (919) 271-4592Cornelia Krahl,(212) 891-3241,(212) 233-5413Karen Ballinger,, (714) 644-9090Elke Wallstab,(910) 763-5561,(910) 545-3421Параметр DSD для оператора INFILE:INFILE ‘file-name’ DSD; задает запятую разделителем по умолчанию; обрабатывает идущие подряд разделители как пропущенные значения; позволяет SAS читать значения с находящимися внутри значенийразделителями, если значение заключено в кавычки.Чтение списков наблюдений• Если одна строка входного файла содержит нескольконаблюдений, например:• Естьcharity.dat112231---5----0----5----0----5----0AQICS495279875 ESCCICU290200780FFC 0CNI 249DAIMI 745SBA 900 V2 550 YYCR 0IDAmount• Надо получитьAQICCICNICSCUDAI49520024927978087542Двойной конечный символ @@Двойной конечный @ сохраняет запись необработанных данныхмежду итерациями шага DATA, пока указатель строки не перейдет запределы конца строки.INPUT var1 var2 var3 … @@;Двойной конечный @ следует использовать только при вводе списка.Пример:Буфер ввода121 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9A Q I4 9 5PDVID$ 4AQIAmountN 8495C C I2 0 0C N I2 4 9Сравнение одиночного конечного @и двойного конечного @ПараметрЭффектСохраняет запись с необработанными данными, пока:@или@@не встретится оператор INPUT без конечного @не начнется следующая итерация шага DATA.Сохраняет запись с необработанными данными вбуфере ввода, пока SAS не прочитает данные за концомстроки.Запись текстовых файлов• Все конструкции синтаксически аналогичны чтению, ноinfile=>file, input=>put• Запись файлов с фиксированным размером полей:• Запись файлов с разделителямиБинарные файлы• Рассматриваются как частный случай текстовых• опция у INFILE или FILE RECFM=N• Могут представлять собой поток••••байт – формат $CHAR1машинных слов – формат $CHAR2, $CHAR4, $CHAR8записей фиксированной длины $CHARwа можно работать и через direct access c помощью указателя @ как длятекстовых файлов с фиксированными полями• Доступ к элементам записи или слова через SUBSTRING• Пример (читать по слову из 2х байт, предпологая формат целогочисла со знаком и корректно определять знак):46.