Вообще после многих неудачных попыток импорта 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, обязательно включите весь свой код в макрос, иначе цикл даст ошибку.
Надеюсь, это поможет!
Что сказал журнал? Вы можете перенести журнал вперед, щелкнув вкладку «Журнал» в нижней части экрана. Вы уверены, что ваш файл указан по указанному пути? – LJW
Сначала перейдите к журналам, и он скажет вам точную причину, без этого невозможно отладить. – NEOmen
Мои $ 0,02 - это то, что у вас возникли проблемы с поиском вашего разделителя или самого файла. Возможно, это табло не пространство, что-то в этом роде. Но обязательно опубликуйте все сообщение об ошибке, а не только одну строку. – Joe