2015-12-28 2 views
0

У меня есть список программ с разной степенью сложности, которые включают тип степени (например, PhD), и я хочу удалить тип степени и сохранить только имя программы. например .:SAS, как извлечь несколько слов из строки

Master of Science in Building Performance and Diagnostics 
Master of Science in Computational Design 
Master of Science in Sustainable Design 
Master of Urban Design 
PhD in Architecture 

Я пытаюсь использовать сканирование, чтобы разделить строку на «в» и извлечь весь текст, который следует, но я не понимаю, результат я получаю. Когда я использую -1 (начало справа) в качестве отправной точки я получаю:

data want; 
    format new_prog old_prog $200.; 
    set have (rename = (program = old_prog)); 
    if count(old_prog, " in ") ge 1 then new_prog = scan(old_prog, -1, "in "); 
run; 


new_prog old_prog 
tecture Master of Science in Architecture 
g   Master of Science in Sustainable Design 
cs  Master of Science in Building Performance and Diagnostics 
t   Master of Science in Architecture-Engineering and Construction Management 

Я не думаю, что это будет работать в любом случае, так как я хочу всю строку после «в», а не просто следующего слова , но даже если я использую сканирование (old_prog, 2, «в»), я ожидаю, что это даст мне следующее слово, но это, кажется, дает мне случайные вещи, например:

program old_prog 
Bu  PhD in Building Performance and Diagnostics 
of  Master of Science in Architecture-Engineering and Construction Management 
Computat PhD in Computational Design 
of  Master of Science in Sustainable Design 
+0

Насколько я знаю, параметр «в», который вы использовали в функции сканирования будет использовать все символы, отдельные разделители. Он не будет работать так, как вы ожидаете. – RamB

ответ

0

Вот как это сделать используя substr и index.

data want; 
format new_prog old_prog $200.; 
infile datalines dsd missover; 
input old_prog :$200.; 

if count(old_prog, " in ") ge 1 then new_prog = substr(old_prog,index(old_prog,"in") + 3); 

datalines; 
Master of Science in Building Performance and Diagnostics 
Master of Science in Computational Design 
Master of Science in Sustainable Design 
Master of Urban Design 
PhD in Architecture 
; 
run; 

Index будет найти положение «в» в строке и передать его SubStr начать сокращать переменную из этой позиции + 3 до конца строки.

0

Рассмотрим шаг данных и ргос решение SQL, используя substr и index функции:

data want; 
    set have; 
    if count(old_prog, " in ") ge 1 
     then new_prog = substr(old_prog, index(old_prog, "in")+3); 
run; 


proc sql; 
    create table want as 
    select *, 
    case when index(old_prog, "in") > 0 
     then substr(old_prog, index(old_prog, "in")+3) 
     else old_prog 
    end as new_prog 
    from want; 
run; 
1

данные;
ввод @ 1 old_prog $ 60;
если find (old_prog, 'in'), то new_prog = substr (old_prog, 1, find (old_prog, 'in'));
else new_prog = old_prog;
datalines;
Мастер Scinence в здании Performance и диагностика
Магистр наук в области вычислительной дизайна
Магистр наук в области устойчивого дизайна
Мастер городского дизайна
кандидат архитектуры
;
run;
proc print данные = have;
run;

OBS old_prog new_prog
1 Мастер Scinence в здании производительности и диагностики Мастер Scinence
2 Магистр наук в области вычислительной дизайна магистра
3 Магистр наук в области устойчивого дизайна Магистр наук
4 Магистр городского дизайна Магистр городского дизайна
5 PhD в области архитектуры PhD

0

У вас есть ряд допустимых вариантов, предлагаемых другими. Могу ли я предложить способ REGEX получить то, что вы хотите?

я заметил три модели в ваших данных образца:

  1. Типичный Сепаратор «в», что вы пытаетесь использовать в образце кода
  2. Когда типичный разделитель не используется, то другой разделитель «из " используется.
  3. Тип степени может быть записан по-разному (магистр наук, магистр наук, доктор философии).

При работе с рисунком в тексте REGEX очень полезен, потому что вы можете определить текстовое поле, которое вы ищете, и извлечь текст, когда шаблон верен.

Смотрите комментарии в коде для получения дополнительной информации:

/* Dropping pattern ids because they are not useful in data */ 
data have (drop=pattern_in pattern_of); 
    /* Reading in the raw data from datalines */ 
    input @1 old_prog $60.; 

    /* Compiling first sample based on "in " pattern. */ 
    pattern_in = prxparse('/in ([\w\s]*)/'); 

    /* Compiling first sample based on "of " pattern. */ 
    pattern_of = prxparse('/of ([\w\s]*)/'); 

    /*If the string satisfied the patter with "in " */ 
    if prxmatch(pattern_in,old_prog) then 
    /* Then extract capture buffer after "in " pattern */ 
    new_prog=prxposn(pattern_in,1,old_prog); 

    /*If the string satisfied the patter with "of " after it didn't find patter "in "*/ 
    else if prxmatch(pattern_of,old_prog) then 
    /* Then extract capture buffer after "of " pattern */ 
    new_prog=prxposn(pattern_of,1,old_prog); 
    datalines; 
Master of Scinence in Building Performance and Diagnostics 
Master of Science in Computational Design 
Master of Science in Sustainable Design 
Master of Urban Design 
PhD in Architecture 
; 

PROC PRINT DATA=have; 
run; 

Результат: enter image description here

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