Существует ограничение SAS на то, насколько большим может быть число и при этом сохраняется точное целочисленное представление. ( На основе двоичных пределов функций мантиссы и экспоненты в значениях с плавающей запятой двойной точности )
Из " SAS Companion для Windows "
Significant Digits and Largest Integer by Length for SAS Variables under Windows
Length Largest
in Integer Significant
Bytes Represented Exponential Digits
Exactly Notation Retained
------ ----------------------- ----------- -----------
3 8,192 2<sup>13</sup> 3
4 2,097,152 2<sup>21</sup> 6
5 536,870,912 2<sup>29</sup> 8
6 137,438,953,472 2<sup>37</sup> 11
7 35,184,372,088,832 2<sup>45</sup> 13
8 9,007,199,254,740,992 2<sup>53</sup> 15
Невозможно напрямую указать форматы столбцов с помощью процедуры IMPORT
.
Вы можете вызвать исходный код шага DATA, созданный процедурой, и изменить его.
Из файла документации " Ссылка на формат для процедур ИМПОРТ И ЭКСПОРТ " Файлы с разделителями
Обработка файлов с разделителями в SAS
Когда вы используете PROC IMPORT для чтения файла, разделенного запятыми, файла с разделителями табуляции или другого файла с разделителями, процедура по умолчанию выполняет следующие действия:
…
- создает шаг DATA с помощью оператора INPUT
- передает весь код компилятору шага DATA, который, в свою очередь, выполняет код.
…
Если вам нужно пересмотреть свой код после запуска процедуры, введите команду RECALL (или нажмите F4) для сгенерированного шага DATA. На этом этапе вы можете добавлять или удалять опции из оператора INFILE и настраивать операторы INFORMAT, FORMAT и INPUT для ваших данных.
Таким образом, шаги будут:
- Передать
Proc IMPORT
, который выводит ноль строк.
Единственное, что требуется от этого шага, - это исходный код, сгенерированныйпроцедура - Открытие нового окна редактирования (т. е. меню Вид / Расширенный редактор)
- Введите команду
RECALL
в командной строке (или меню Выполнить / восстановить последнюю отправку) - Отредактируйте вызванный исходный код
- Снимите ограничитель where=(1=0))
- Измените INFORMAT
с best32.
на что-то вроде $32.
- Удалите соответствующий FORMAT
оператор - Отправьте отредактированный код
Пример:
Создать образец набора данных со слишком большими целыми числами и IMPORT
it
filename myfile temp;
data _null_;
file myfile;
put "one;two;three";
put "1;2;3";
put "301185964728506014850593;301185964728506014850594;301185964728506014850595";
put "301185964728506014850593;301185964728506014850594;301185964728506014850595";
put "301185964728506014850593;301185964728506014850594;301185964728506014850595";
put "301185964728506014850593;301185964728506014850594;301185964728506014850595";
put "301185964728506014850593;301185964728506014850594;301185964728506014850595";
put "301185964728506014850593;301185964728506014850594;301185964728506014850595";
run;
proc import
file=myfile
dbms=dlm
replace
out=myimport(where=(1=0) /* output limiter */
;
delimiter=';';
run;
Напомним исходный код SAS, отредактируйте его и повторно отправьте
/**********************************************************************
* PRODUCT: SAS
* VERSION: 9.4
* CREATOR: External File Interface
* DATE: 07NOV19
* DESC: Generated SAS Datastep Code
* TEMPLATE SOURCE: (None Specified.)
***********************************************************************/
data WORK.MYIMPORT
/*(where=(1=0)) */ /* <------ remove limiter */
;
%let _EFIERR_ = 0; /* set the ERROR detection macro variable */
infile MYFILE delimiter = ';' MISSOVER DSD lrecl=32767 firstobs=2 ;
informat one $32. ; /* <-------- change informats */
informat two $32. ;
informat three $32. ;
/* format one best12. ;*/ /* <--------- remove format statements */
/* format two best12. ;*/
/* format three best12. ;*/
input
one
two
three
;
if _ERROR_ then call symputx('_EFIERR_',1); /* set ERROR detection macro variable */
run;
Возвращает набор данных
Obs one two three
1 1 2 3
2 301185964728506014850593 301185964728506014850594 301185964728506014850595
3 301185964728506014850593 301185964728506014850594 301185964728506014850595
4 301185964728506014850593 301185964728506014850594 301185964728506014850595
5 301185964728506014850593 301185964728506014850594 301185964728506014850595
6 301185964728506014850593 301185964728506014850594 301185964728506014850595
7 301185964728506014850593 301185964728506014850594 301185964728506014850595