2015-04-21 4 views
0

Что не так с импортированным кодом? Я пытаюсь импортировать текстовый файл в SAS.SAS: импорт текстового файла

proc import DATAFILE="C:\Users\Tiffany\Documents\Inpatientaveragelengthofstaysince2009.txt" 
    out=Indivs dbms=dlm replace; 
    delimiter=' '; 
    getnames=yes; 
run; 

Я получаю сообщение ниже:

ERROR: Import unsuccessful. See SAS Log for details.

+2

Что сказал журнал? Вы можете перенести журнал вперед, щелкнув вкладку «Журнал» в нижней части экрана. Вы уверены, что ваш файл указан по указанному пути? – LJW

+0

Сначала перейдите к журналам, и он скажет вам точную причину, без этого невозможно отладить. – NEOmen

+0

Мои $ 0,02 - это то, что у вас возникли проблемы с поиском вашего разделителя или самого файла. Возможно, это табло не пространство, что-то в этом роде. Но обязательно опубликуйте все сообщение об ошибке, а не только одну строку. – Joe

ответ

0

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

Вы можете вместо этого использовать команду входной_файл внутри datastep:

data input_data; 
infile "../../file.txt" 
firstobs = 2 
dlm = " " 
missover 
dsd 
lrecl = 32767 
input 
    var1 : $char128. /*string field of 128 chars long*/ 
    var2 : best32. /*numbers of all types ints, floats, etc */ 
    ... 
    /*do this for every variable (column) in you .txt file */ 
; 
run; 

Код выше более или менее то, что импорт прок делает. Проблема с импортом proc заключается в том, что он пытается «угадать» правильные параметры (например, dsd, missover и т. Д.) И типы данных, и это не всегда удается. Вы можете найти более подробную информацию о том, что эти параметры делают here.

Например, опция missover сообщает sas, что делать, если она обнаруживает два последовательных разделителя. (Должно ли это рассматриваться как пустой столбец и оставить одно значение пустым, когда оно читает следующее или просто вытаскивает следующее доступное значение?)

Конечно, приведенный выше код не очень практичен в случае длинных txt-файлов с большим количеством столбцов, так как вам придется набирать каждую метку столбца своим типом данных самостоятельно.

Одним из возможных решений этой проблемы является:

data headers; 
infile "../../file.txt" 
firstobs = 1 
obs = 1 
dlm = "_" /*make sure to here to use a delimiter DIFFERENT from the real one to keep everything in one observation*/ 
missover 
lrecl = 32767 
input 
    whole_line : $char32767. 
; 
run; 

выше шаг создает набор данных, который имеет одно наблюдения, которое содержит все заголовки столбцов, разделенные вашего разделитель. Теперь вы можете использовать:

proc sql noprint; 
select distinct tranwrd(compress(line),","," ") as lineTest length=32767  into: headers from headers length; 
quit; 

Вышеуказанных коды создает макро-переменные заголовки с именами столбцов, разделенных пробелами (функция tranwrd() в основном заменяет «» с „“, потому что я обычно работаю с csv-файлы, поэтому это может не понадобиться для вас. В общем случае использование пробела как разделителя может быть не очень хорошей идеей - это применимо, если у вас есть строковые поля, содержащие пробелы. Ошибка, которую вы получаете, может быть связана с этим)

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

data inputFile (compress=binary) ; 
    infile "../../file.txt" 
    dsd 
    dlm = "," 
    lrecl = 32767 
    firstobs = 2 
    ; 
    input 
    %do i=1 %to %words(&headers); 
     %let currCol = %scan(&headers. , &i.); 
     &currCol : $char256. 
    %end; 
    ; 
run; 

Это создаст нужный набор данных, не беспокоясь, изменилась структура файла (столбцы были добавлены или удалены), что делает ваш код более динамичным. Конечно, это оставляет проблему, что все значения импортируются как символы.

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

Если вы будете использовать макропеременные и% do-loop, обязательно включите весь свой код в макрос, иначе цикл даст ошибку.

Надеюсь, это поможет!

+0

На самом деле опция DSD указывает, что SAS обрабатывает смежные разделители, поскольку это означает отсутствие значения. – Tom

0

В дополнение к выше замечания, строка лога выше этой линии:

ОШИБКА: Импорт безуспешной. Подробнее см. В журнале SAS.

обычно содержит сведения о проблемах.

Дополнительной опцией для добавления в импорт является «GUESSINGROWS = MAX;» который сообщает SAS, чтобы отсканировать весь файл, прежде чем принимать решение о том, каков каждый столбец (с точки зрения размера и типа). Как @MrfksIV вложил в их ответ, как правило, безопаснее использовать datastep, хотя, поскольку тогда вы точно будете знать, что читается, это то, что я делаю в 90% случаев.

0

Непонятно из вашего вопроса, как вы хотите, чтобы текстовый файл читался. Вот код для чтения каждой строки файла в виде отдельного наблюдения.

data lines; 
    infile 'C:\YourFile\here.txt' dlm = '```'; 
    length line $ 32767; 
    input line; 
run; 

Это работает, установив разделитель на последовательность символов, которые вы не увидите в своем файле. Я использовал три обратных галочки в ряд.

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