2016-12-03 2 views
0

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

Вот небольшой образец файла данных:

Уровни 1- 6 старт в положениях 1, 10, 19, 28, 37, и 46, соответственно. enter link description here Вот мой код:

Data peg; 
    infile Pegasus dlm= ' '; 
    length Job_Title $23 Employee_Name $20; 
    input Level & @; 
    if Level="(Level1)" then 
    input @10 Job_Title & @34 Employee_Name & @108 Salary dollar8. ; 
    else if Level="(Level2)" then 
    input @19 Job_Title & Employee_Name & @108 Salary dollar8. ; 
    else if Level="(Level3)" then 
    input @28 Job_Title & Employee_Name & @108 Salary dollar8. ; 
    else if Level="(Level4)" then 
    input @37 Job_Title & Employee_Name & @108 Salary dollar8. ; 
    else if Level="(Level5)" then 
    input @46 Job_Title & Employee_Name & @108 Salary dollar8. ; 
    else if Level="(Level6)" then 
    input @55 Job_Title & Employee_Name & @108 Salary dollar10.; 
run; 

enter image description here Это то, что происходит, когда я запускаю приведенный выше код.

+0

Пожалуйста, разместите несколько примеров данных в виде текста. – user667489

+0

Никто не может запускать ваш код на основе изображения. Я бы предложил прочитать каждую строку как длинную строку и разбор. Функция SCAN() будет полезна. – Reeza

+0

Уровень 3 не работает, потому что это IF/THEN. Когда условие истинно, другие не тестируются, поэтому, если ваше второе условие истинно, вы делаете шаг if/then и никогда не достигаете своего третьего шага. – Reeza

ответ

3

Ваш код, вероятно, будет работать, если вы удалите опцию DSD в инструкции INFILE и удалите формат из первого INPUT и добавили трейлинг @, чтобы удерживать строку для условно сгенерированного INPUT. Значение Employee_Name будет иметь() вокруг него, но вы можете удалить их позже.

infile Pegasus truncover ; 
length Level $8 Job_Title $23 Employee_Name $20 Salary 8; 
input Level @; 

Но вам не нужны условно сгенерированные операторы INPUT с жестко закодированными местоположениями столбцов. Вы должны просто игнорировать отступ. Прочитайте в строке и проанализируйте значения, основанные на местоположениях ().

Эти данные выглядят достаточно чистыми, чтобы вы могли просто читать поля напрямую с помощью модификатора &, если вы сообщите SAS о том, чтобы обработать () в качестве дополнительных разделителей в дополнение к стандартным разделителям по умолчанию символа пробела.

data want; 
    infile cards dlm='()' truncover; 
    length Level $8 Job_Title $23 Employee_Name $20 Salary 8 ; 
    informat salary comma. ; 
    format salary dollar12. ; 
    input (Level -- Salary) (&) ; 
cards;                                 
(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      
;  

Вот что первые несколько значений выглядит следующим образом: enter image description here

Если это не работает, то читать его в переменную и использовать SCAN() разобрать его.

input string $107. salary; 
    level = scan(string,1,'()'); 
    job_title = left(scan(string,2,'()')); 
    employee_name = left(scan(string,3,'()')); 
+0

Это немного упрощает. Если бы я попытался освоить отступы и/или логику if/then/else для этого на основе уровня, как бы я это сделал? Я хотел бы также понять, как это сделать, в идеале. – AvdotyaC

+0

Возможно, ваш код будет работать, если вы удалите опцию DSD в инструкции INFILE. Удален формат из первого INPUT и добавлен трейлинг @. – Tom

+0

Он почти работает ... с яркой стороны, он имеет доступ ко всем наблюдениям. Тем не менее, он только обращается к именам для уровня 1. Остальные - вроде janky.Я приложил картинку выше. – AvdotyaC

Смежные вопросы