2017-12-07 5 views
0

공백이있는 성을 하나의 이름 블록으로 추출하는 방법에 대해 조언 해 줄 수 있습니까? '어떻게 공백이있는 성을 '하나의 이름'/ 'en bloc'으로 추출합니까?

는 내가 첫 번째 성 (첫 번째 저자 및 다른 저자를 제외하고 그렇게 만) 원하는이

clear 
input str40 name 
"R. P. de la Espriella Guerrero"   
"J. de Carvalho Ponce"     
"E. De Freitas Drumond"     
"R. de la Fuente and M. E. Medina-Mora" 
"C. Van Heyningen and I. D. Watson" 
"A. Z. van de Wiel and D. W. de Lange" 
end 

과 같이 데이터 세트의 이름을 가지고 있지만 추출 할 공간이 그 이름을 원하는 일 블록. 다음과 같이 그래서, 궁극적으로 예를 들어, 데이터 집합의 결과 :

clear 
input str40 name 
"de la Espriella Guerrero"   
"de Carvalho Ponce"     
"De Freitas Drumond"    
"de la Fuente" 
"Van Heyningen" 
"van de Wiel" 
end 

나는 어떤 도움을 감사하게 될 거라고.

감사합니다.

+0

'및'이 이름의 일부인지 여부를 어떻게 결정합니까? – bew

+0

@bew에게 감사드립니다. 이것은 불행히도 어려움의 일부입니다. All '다음에 공백이 있고 그 다음 대문자로 된 첫 번째 이름 약어로 시작하는 다른 이름 (예 : D. W. de Lange) –

+0

이 있습니다. De, Du 등 –

답변

1

다음은 위의 내 의견에 제공된 두 가지 규칙을 구현하는 코드입니다. 사용 된 Stata 버전이 유니 코드 문자열 기능을 지원한다고 가정합니다.

clear 
input str40 name 
"R. P. de la Espriella Guerrero"   
"J. de Carvalho Ponce"     
"E. De Freitas Drumond"     
"R. de la Fuente and M. E. Medina-Mora" 
"C. Van Heyningen and I. D. Watson" 
"A. Z. van de Wiel and D. W. de Lange" 
end 
generate surname = name 
replace surname = usubstr(surname,1,ustrpos(surname+" and "," and ")-1) 
list, clean noobs 
replace surname = usubstr(surname,ustrrpos(surname,". ")+1,.) 
list, clean noobs 
+0

감사합니다. 그 일을하는 것처럼 보입니다. 단지 두 번째 usubstr이 성 앞에 공간을 생성한다는 것을 알게되었습니다. 그래서 이것을 대체하여'surname = usubstr (성, ustrrpos (성), +2) .'을 대체했습니다. 시작 위치가 "."(즉, 공백/빈칸이있는 전체 정지)으로 지정 되었기 때문에 이러한 일이 발생하는 이유는 분명하지 않습니다. ustrrpos는 "."및 "."을 처리합니까? 같은거야? –

+0

또한 교육을 위해서 pls는 두 번째 usubstr에서'.'이하는 것을 알려줄 수 있습니까? 즉'usubstr (s, n1, n2)'에서'n2 == .'는 무엇을합니까? –

+0

좋은 캐치. 실제로'ustrrpos (surname, ".")'는''. "'에 첫 번째 문자의 위치를 ​​반환하므로 2 대신 1을 추가하면 내 부분에 대한 감독이됩니다. 두 번째 질문은'help usubstr()'의 출력을 검토하는 것이 좋습니다 - Stata의 온라인 도움말이 이와 같은 질문에 대한 첫 번째 중단 점이되어야하므로이 응답은 사용자가 더 익숙해 지도록 권장하기위한 것입니다. –

관련 문제