Разделите полное имя на имя и фамилию, когда присутствует отчество - PullRequest
0 голосов
/ 02 мая 2019

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

Norton, Eleanor Holmes [D-DC] 16 0 440 288 0 
Cohen, Steve [D-TN] 15 0 320 209 0 
Schakowsky, Janice D. [D-IL] 6 0 289 186 0 
McGovern, James P. [D-MA] 8 1 252 139 0 
Clarke, Yvette D. [D-NY] 7 0 248 166 0 
Moore, Gwen [D-WI] 2 3 244 157 1 
Hastings, Alcee L. [D-FL] 13 1 235 146 0 
Raskin, Jamie [D-MD] 8 1 232 136 0 
Grijalva, Raul M. [D-AZ] 9 1 228 143 0 
Khanna, Ro [D-CA] 4 0 223 150 0 

1 Ответ

0 голосов
/ 02 мая 2019

Добрый день,

SAS немного неуклюж, когда дело касается строк. Однако это может быть сделано. Как уже упоминалось, это определенная логика, которая является действительно сложной частью.

Начните с некоторых необработанных данных ...

data begin; 
input raw_str $ 1-100; 
cards;
  Norton, Eleanor Holmes [D-DC] 16 0 440 288 0 
  Cohen, Steve [D-TN] 15 0 320 209 0 
  Schakowsky, Janice D. [D-IL] 6 0 289 186 0 
  McGovern, James P. [D-MA] 8 1 252 139 0 
  Clarke, Yvette D. [D-NY] 7 0 248 166 0 
  Moore, Gwen [D-WI] 2 3 244 157 1 
  Hastings, Alcee L. [D-FL] 13 1 235 146 0 
  Raskin, Jamie [D-MD] 8 1 232 136 0 
  Grijalva, Raul M. [D-AZ] 9 1 228 143 0 
  Khanna, Ro [D-CA] 4 0 223 150 0 
; run;

Сначала я выбираю первые имена до первой скобки.

Количество строк

data names; 
  set begin; 
  names_only = scan(raw_str,1,'[');
  Nr_of_str = countw(names_only,' ');
run;

Предположение: первая строка - это фамилия.

Если есть только 2 строки, первая и последняя довольно просты со сканированием и подстрокой:

data names2; 
  set names; 
  if Nr_of_str = 2 then do; 
    last_name = scan(names_only, 1, ' '); 

    _FirstBlank = find(names_only, ' ');
    first_name = strip(substr(names_only, _FirstBlank));
  end; 
run;

Предположение: есть только 3 строки. Подход 1. Второе имя имеет точку в нем. Отфильтруйте это. Подход 2. Отчество короче настоящего имени:

data names3; 
  set names2; 
  if Nr_of_str > 2 then do; 
    last_name = scan(names_only, 1, ' '); /*this should still hold*/

    _FirstBlank = find(names_only, ' '); /*Substring approach */
    first_name = strip(substr(names_only, _FirstBlank));


   second_str = scan(names_only, 2, ' ');
   third_str = scan(names_only, 3, ' ');

   if  find(second_str,'.') = 0 then   /*1st approch */
    first_name =  scan(names_only, 2, ' ');
  else 
    first_name =  scan(names_only, 3, ' ');


   if  len(second_str) > len(second_str) then   /*2nd approch */
    first_name =  second_str;
  else 
    first_name =  third_str;


  end; 
run;

Подробнее см. подстрока и scan :

...