#sas
Вопрос:
Я новичок в SAS. У меня есть входной файл txt и я загрузил его в свой рабочий каталог, когда я читаю и форматирую столбец DATE_JOINED, дата отсутствует, код выглядит следующим образом:
data example_txt;
infile '/home/u59667351/example_csv/example_csv.txt' dlm='<|>' firstobs=2;
input PERSON_ID $ DEPT_ID $ DATE_JOINED yymmdd10. ;
format DATE_JOINED yymmdd10.;
run;
текстовый файл с именем example_csv выглядит следующим образом:
PERSON_ID<|>DEPT_ID<|>DATE_JOINED
AAAAA<|>S1<|>2021/01/03
BBBBBB<|>S2<|>2021/02/03
CCCCC<|>S1<|>2021/03/05
Дата ВЫВОДА для столбца DATE_JOINED отсутствует.
Есть какие-нибудь предложения?
Спасибо
Комментарии:
1. Ваш код и выходные данные НЕ СОВПАДАЮТ. В вашем коде показан набор данных с именем example_txt, но показан файл example_csv, поэтому я думаю, что вы, возможно, ищете не тот файл?
2. Ага, ты прав. Потому что я пробовал как CSV, так и txt-файлы, и все они не работают. Теперь это решено. Спасибо.
Ответ №1:
Если это не просто проблема с поиском нужного файла, попробуйте вместо этого использовать инструкцию INFORMAT, немного более чистую.
data example_txt;
infile '/home/u59667351/example_csv/example_csv.txt' dlm='<|>' firstobs=2;
informat person_id $8. DEPT_ID $8. date_joined yymmdd10.;
input PERSON_ID DEPT_ID DATE_JOINED ;
format DATE_JOINED yymmdd10.;
run;
Ответ №2:
В вашем шаге обработки данных есть две ошибки.
Во-первых, вы используете DLM=
опцию «Файл», когда кажется, что вы собирались использовать эту DLMSTR=
опцию. При перечислении нескольких символов в параметре DLM= каждый отдельный символ рассматривается как разделитель. С параметром DLMSTR= вся последовательность должна выглядеть точно так, как указано, чтобы ее можно было рассматривать как разделитель.
Во-вторых, вы пытаетесь прочитать DATE_JOINED, используя режим ФОРМАТИРОВАННОГО ввода, что противоречит цели чтения данных с разделителями. Поскольку курсор указывает после <
того, что обозначило конец значения DEPT_ID, следующие 10 символов не представляют действительную дату. При вводе в режиме СПИСКА все ведущие разделители пропускаются перед началом чтения следующего значения из файла.
При использовании спецификации informat во входном операторе добавьте к ней :
модификатор, чтобы использовать режим ввода СПИСКА вместо режима ФОРМАТИРОВАНИЯ.
Или удалите встроенную информацию и используйте инструкцию INFORMAT, чтобы задать информацию, которую вы хотите использовать при чтении текста в этой переменной.
Вероятно, вы также захотите добавить опцию УСЕЧЕНИЯ в инструкцию INFILE, чтобы оператор ВВОДА не переходил к следующей строке для поиска значения, когда последние значения пусты.
data example_txt;
infile '/home/u59667351/example_csv/example_csv.txt'
dlmstr='<|>' firstobs=2 truncover
;
input PERSON_ID $ DEPT_ID $ DATE_JOINED :yymmdd. ;
format DATE_JOINED yymmdd10.;
run;
PS При использовании режима СПИСКА ввод ширины в спецификации informat игнорируется. Все следующее значение в строке используется независимо от того, сколько символов оно содержит.