Тип поля набора данных SAS num to char с текущим форматом - PullRequest
1 голос
/ 04 мая 2011

В настоящее время у меня есть набор данных, который содержит необходимые мне переменные вместе с необходимыми форматами.

Теперь я использую функцию getvarc() (среди прочих) в цикле, чтобы эти переменные записывались в файл.
Первая проблема, возникающая в ходе курса, заключается в том, что некоторые переменные имеют тип не тип char, а тип num. Я мог бы использовать getvarn() для их извлечения, но тогда формат уходит впустую, что мне действительно нужно.

например. дата в числовом виде: 18750. Формат = гггммд10. Таким образом, выглядит как 2011-05-03

Используя value=getvarn() для этого поля, он получит 18750 для значения. Если я затем захочу вывести (используя PUT) это значение, оно не даст мне 2011-05-03 дату, как я хочу.

Так что теперь я ищу лучший способ сделать это.
Первый вариант - использовать набор данных sashelp.vcolumn, чтобы получить формат для этого поля и использовать его в операторе put для вывода в нужном формате.
Второй вариант - преобразовать набор данных, содержащий это поле (на самом деле речь идет о нескольких наборах данных), где я преобразую все поля типа num в типы символов, сохраняя правильный формат.

Какой вариант мне выбрать?
И в случае второго варианта, можно ли это сделать общим способом (как я уже говорил, речь идет не только об одной переменной)?

EDIT:

После ответа Cmjohn я нашел способ решить мою проблему. Не использовать sashelp.vcolumn, а использовать функцию varfmt. Итак, краткое объяснение того, что я делаю в своем коде:

  data _null_
  set dataset1;
  file file1;
  if somefield = x then do;
    dsid = open(datasetfield, i);
    rc = fetchobs (dsid);
    varnum = varnum(dsid,anotherfield);
    **varfmt = varfmt(dsid,anotherfield);
    if vartype(dsid,anotherfield) = 'N' then do;**
      value = getvarn(dsid,varnum);
      **value_formatted = putn(value,varfmt);**
    **end;
    else do;**
      value = getvarc(dsid,varnum);
      **value_formatted = putc(value,varfmt);
    end;**
    put value_formatted;
  end;
  run;

Так что это вообще (быстро из моей головы), что я делаю сейчас. Смелая часть решения - это то, что я придумал после ответа Cmjohns. Поэтому на мой первый вопрос ответили: «Как это сделать?».

Но мой добавленный вопрос: Что было бы наиболее эффективным в долгосрочной перспективе: сохранить этот процесс или сделать так, чтобы мои данные устанавливали способ, которым все данные могут быть прочитаны, используя только getvarc без необходимости ввода типа -чек и getfmt()?

1 Ответ

2 голосов
/ 04 мая 2011

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

...