2015-04-29 2 views
0

Мой PROC IMPORT шаг бросает «import unsuccessful», когда я пытаюсь прочитать файл с разделителем «~», содержащий поле адреса. В CSV-файле 5-байтовый почтовый индекс автоматически обрабатывается как числовое поле, и время от времени я получаю плохие записи данных с недопустимыми почтовыми индексами как VXR1 @. Когда это встречается, я получаю ошибку «import unsuccessful» и сбой в работе SAS. PROC IMPORT автоматически преобразуется в шаг DATA с помощью infile. Поэтому я попробовал шаг DATA с опцией INFILE и с INFORMATS и FORMATS и изменил FORMAT ZIP на буквенно-цифровой. Но сейчас я столкнулся с другой проблемой. С ключевыми словами DATA, INFORMAT и FORMAT происходит несоответствие длин, и данные автоматически перемещаются в разные местоположения. Может ли кто-нибудь помочь мне разобраться в решении этой проблемы?SAS PROC Import vs DATA шаг с INFILE

Включена PROC ИМПОРТА я и файл DATA шаг, который я использовал ниже для справки:

data WORK.TRADER_STATS        ; 
      %let _EFIERR_ = 0; /* set the ERROR detection macro variable */ 
      infile '/sascode/test/TRADER_STATS.csv' delimiter = '~' MISSOVER DSD lrecl=32767 firstobs=2 ; 
       informat TRADER_id best32. ; 
       informat dealer_ids $60. ; 
       informat dealer_name $27. ; 
       informat dealer_city $15. ; 
       informat dealer_st $2. ; 
       informat dealer_zip $5. ; 
       informat SNO best32. ; 
       informat start_dt yymmdd10. ; 
       informat end_dt yymmdd10. ; 
      input 
         TRADER_id 
         dealer_ids $ 
         dealer_name $ 
         dealer_city $ 
         dealer_st $ 
         dealer_zip 
         sno 
         start_dt 
         end_dt 
      ; 
      if _ERROR_ then call symputx('_EFIERR_',1); /* set ERROR detection macro variable */ 
      run; 


proc import file="/sascode/test/TRADER_STATS_BY_DAY.csv" out=WORK.TRADER_STATS_BY_DAY 
dbms=dlm replace; 
delimiter='~'; 
;run; 
+0

может быть, вы можете использовать 'GUESSINGROWS = n' где п является достаточно большим для SAS, чтобы найти ZIP код с буквами, так SAS получит правильный тип данных. Есть ли шанс поделиться своими данными? – mucio

+0

Попробуйте добавить знак $ после слова dealer_zip в инструкции ввода, хотя это не имеет значения. Кроме того, измените неверное на перевод. – Reeza

ответ

1

Попробуйте Использование : colon operator, который сообщит SAS использовать информ прилагаемый но прекратить чтение значения для этого переменного, когда ограничитель встречается, которая сортирует вашу проблему - данные получать переместить в другое место автоматически

data WORK.TRADER_STATS        ; 
      %let _EFIERR_ = 0; /* set the ERROR detection macro variable */ 
      infile '/sascode/test/TRADER_STATS.csv' delimiter = '~' MISSOVER DSD lrecl=32767 firstobs=2 ; 
      input  TRADER_id : best32. 
         dealer_ids : $60. 
         dealer_name : $27. 
         dealer_city : $15. 
         dealer_st $ : $2. 
         dealer_zip : $5. 
         sno : best32. 
         start_dt : yymmdd10. 
         end_dt : yymmdd10.; 
      if _ERROR_ then call symputx('_EFIERR_',1); /* set ERROR detection macro variable */ 
      run; 
+0

NEOmen - Спасибо. двоеточие спас меня. Также как @Reeza предположил, что я использовал TRUNCOVER, который запретил устанавливать флаг _EFIERR_, когда я получаю неправильные данные. Еще раз Благодарю вас обоих –

Смежные вопросы