Введите текстовый файл, формат даты вывода отсутствует

#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 игнорируется. Все следующее значение в строке используется независимо от того, сколько символов оно содержит.