Проблема с SAS proc import guessingrows

#import #sas #dataset #proc

#импорт #sas #набор данных #прок #процесс

Вопрос:

Я пытаюсь импортировать csv-файл в SAS с помощью proc import; Я знаю, что аргумент guessingrows автоматически определит тип переменной для каждого столбца моего csv-файла. Но есть проблема с одним из моих CSV-файлов, в котором есть два целых столбца с пустыми значениями; эти столбцы в моем csv-файле должны быть числовыми, но после выполнения приведенного ниже кода эти два столбца становятся символьным типом, есть ли какие-либо решения для изменения типа этих двух столбцов на числовой во время или после его импорта в SAS?

Здесь ниже приведен код, который я запускаю:

 proc import datafile="filepathdatasetA.csv"
out=dataA
dbms=csv
replace;
getnames=yes;
delimiter=",";
guessingrows=100;
run;
  

Спасибо!

Комментарии:

1. Самое быстрое решение — отредактировать файл csv и поместить . в первую строку, где ,, находятся. Измените их на ,.,

2. Спасибо, Ричард, мне не разрешено изменять исходный документ, есть ли другой способ сделать это?

3. Кажется, вы уже знаете, как должны быть определены данные. Почему вы используете PROC IMPORT? Почему бы просто не выполнить шаг данных для чтения файла?

Ответ №1:

Изменение кода @Richard я бы сделал:

 filename csv 'c:tmpabc.csv';

data _null_;
  file csv;
  put 'a,b,c,d';
  put '1,2,,';
  put '2,3,,';
  put '3,4,,';
run;

proc import datafile=csv dbms=csv replace out=have;
  getnames=yes;
run;
  

Перейдите в окно ЖУРНАЛА и посмотрите код SAS, созданный с помощью PROC IMPORT:

 data WORK.HAVE    ;
%let _EFIERR_ = 0; /* set the ERROR detection macro variable */
infile CSV delimiter = ',' MISSOVER DSD lrecl=32767 firstobs=2 ;
    informat a best32. ;
    informat b best32. ;
    informat c $1. ;
    informat d $1. ;
    format a best12. ;
    format b best12. ;
    format c $1. ;
    format d $1. ;
 input
             a
             b
             c  $
             d  $
 ;
 if _ERROR_ then call symputx('_EFIERR_',1);  /* set ERROR detection macro   variable */
 run;
  

Запустите этот код и увидите, что два последних столбца импортированы как символы.
Проверьте это:

 ods select  Variables;
proc contents data=have nodetails;run;
  

введите описание изображения здесь

Возможно изменить этот код и загрузить требуемые столбцы как числовые. Я бы не стал удалять и добавлять столбцы в SQL, потому что в этих столбцах могут быть где-то данные.

Изменен код импорта:

 data WORK.HAVE    ;
%let _EFIERR_ = 0; /* set the ERROR detection macro variable */
infile CSV delimiter = ',' MISSOVER DSD lrecl=32767 firstobs=2 ;
    informat a best32. ;
    informat b best32. ;
    informat c best32;
    informat d best32;
    format a best12. ;
    format b best12. ;
    format c best12;
    format d best12;
 input
             a
             b
             c
             d
 ;
 if _ERROR_ then call symputx('_EFIERR_',1);  /* set ERROR detection macro   variable */
 run;
  

Проверьте описание таблицы:

 ods select  Variables;
proc contents data=have nodetails;run;
  

введите описание изображения здесь

Ответ №2:

Вы можете изменить тип столбца столбца, в котором все пропущенные значения удалены, и добавить его обратно как другой тип.

Пример (SQL):

 filename csv 'c:tempabc.csv';

data _null_;
  file csv;
  put 'a,b,c,d';
  put '1,2,,';
  put '2,3,,';
  put '3,4,,';
run;

proc import datafile=csv dbms=csv replace out=have;
  getnames=yes;
run;

proc sql;
  alter table have
    drop c, d
    add c num, d num
  ;