#sas #character #text-manipulation
#sas #характер #обработка текста
Вопрос:
У меня есть набор данных с символьной переменной под названием «name». Он содержит полное имя человека следующим образом: «firstname среднее имя фамилия».
Я хочу, чтобы данные были переставлены так, чтобы они стали: «фамилия, имя, среднее имя».
Я не настолько разбираюсь в функциях SAS, но я использовал некоторые из немногих, которые я знаю.
(Мой код можно увидеть ниже).
В первой попытке (тест2) Я не получаю желаемого результата — я получаю: «Фамилия, имя отчество», а не «Фамилия, имя отчество» — моя проблема в запятой.
Поэтому я подумал, что смогу решить свою проблему, создав новую переменную last name, содержащую запятую в конце (в test2_new ). Но я не получаю того, чего хочу? SAS поставил три точки в конце, а не запятую?
Я надеюсь, что человек, обладающий большими навыками SAS, чем я, сможет ответить на мой вопрос??
С уважением, Мария
Ответ №1:
данные имеют ; введите @ 1 текст и 64 доллара. ; строки данных ; Сьюзан Смит Дэвид Джеймсон Брюс Томас Форсайт ; выполнить ; данные нужны ; набор имеет ; lastname = scan(текст, -1,' ') ; firstnames = substr(текст, 1,длина (текст)-длина (фамилия)) ; newname = catx(', ',фамилия, имена) ; выполнить ;
Что дает
текст фамилия имя отчество новое имя Сьюзан Смит Смит Сьюзан Смит, Сьюзан Дэвид Джеймсон Джеймсон Дэвид Джеймсон, Дэвид Брюс Томас Форсайт Форсайт Брюс Томас Форсайт, Брюс Томас
Комментарии:
1. Спасибо за ответ. Но этот метод не работает, когда у вас есть переменная MiddleName? Я думаю, тогда новое имя будет: Форсайт, Брюс, Томас?
2. Исходя из вашего исходного сообщения, вам не нужна явная переменная middlename, просто чтобы изменить одну строку в формате ‘first [middle] last’ на ‘last, first [middle]’. Этот метод работает для любого количества средних имен, начиная с нуля.
3. Ах, хорошо. Спасибо за ответ — это было очень полезно!
Ответ №2:
Выражения PERL здесь являются полезным инструментом, особенно PRXCHANGE. Веб-сайт поддержки SAS предоставляет хороший пример того, как поменять местами имя и фамилию, вот небольшая модификация этого кода. Я обслуживал только людей с 2 или 3 именами, но при необходимости это должно быть довольно просто расширить. Мой код основан на наборе данных, созданном в ответе от @Chris J.
data want;
set have;
if countw(text)=2 then text = prxchange('s/(w ) (w )/$2, $1/', -1, text);
else if countw(text)=3 then text = prxchange('s/(w ) (w ) (w )/$3, $1 $2/', -1, text);
run;