[SAS] Чтение в смешанных типах записей (.dat) с несколькими уровнями за один шаг данных - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть набор данных (employeeinfo.dat), который выглядит (обратите внимание, что гораздо больше наблюдений, чем просто это) следующее:

(Level1) Chief Executive Officer  (Anthony Miller )                                                    $433,800
     (Level2) Chief Sales Officer  (Harry Highpoint )                                                  $243,190
              (Level3) Vice President  (Henri Le Bleu )                                                $194,885
                       (Level4) Director  (Reginald Steiber )                                          $156,065
                                (Level5) Sales Manager  (Dennis Lansberry )                             $84,260
                                         (Level6) Sales Rep. I  (Saunders Briggi )                      $26,335
                                (Level5) Senior Sales Manager  (Louis Favaron )                         $95,090
                                         (Level6) Sales Rep. I  (Harold Boulus )                        $26,035

Мне нужно прочитать это в SAS, чтобы я мог разделитьданные в следующие переменные: уровень, должность, имя и зарплата.

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

Вот моя слабая попытка(Я, по крайней мере, правильно загрузил первую запись), просто чтобы убедиться, что у меня вообще есть представление:

data emp;
    infile 'employeeinfo.dat';
    input @1 position $9.
          @10 jobtitle $24.
          @35 name $72.
          @108 salary dollar8.;
run;

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

Есть идеи, как это сделать?

Примечание: у меня есть одно ограничение в этом.В тексте, который я использую, говорится, что цель этого упражнения - дать опыт работы с файлами необработанных данных фиксированной ширины, которые не имеют разделителей.Решение должно иметь несколько операторов ввода с элементами управления указателем.

1 Ответ

0 голосов
/ 03 декабря 2018

Разрыв между названием должности и именем всегда составляет не менее двух пробелов, а также между именем и зарплатой.Когда входные поля имеют два или более пробелов между ними, аргумент list input style & использует два пробела в качестве маркера конца значения и, таким образом, будет читать те значения полей, которые содержат один пробел между словами.Аргумент : для salary будет искать значение, начиная со следующего непустого до следующего пробела или конца строки.

filename have 'c:\temp\sample.txt';

data want;
  attrib
    level length=$10
    position length=$50
    name length=$30
    salary length=8
  ;
  infile have missover;
  input  
    level
    position&
    name&
    salary: dollar. ;
  ;
run;

Значения level и name могут бытьочищается с помощью функции compress:

level = compress(level,'()');
name = compress(name,'()');
...