2013-02-15 7 views
1
을 사용하여 .txt에서 데이터 입력

나는 궁극적으로 Stata를 가져올 .txt를 통해 perl을 사용하여 다음을 긁어 모으고 있습니다. 어떤 형식 옵션이 작동합니까? 나는 그러한 관찰이 많기 때문에 내가 일반화 할 수있는 접근법을 사용하고자한다. Stata - ""및,

원래 데이터

의 형식은 :

First Name: Allen 
Last Name: Von Schmidt 
Birth Year: 1965 
Location: District 1, Ocean City, Cape May, New Jersey, USA 

First Name: Lee Roy 
Last Name: McBride 
Birth Year: 1967 
Location: Precinct 5, District 2, Chicago, Cook, Illinois, USA 

목표는 STATA의 변수를 만드는 것입니다 :

First Name: Allen 
    Last Name: Von Schmidt 
    Birth Year: 1965 
    County: Cape May 
    State: New Jersey 

    First Name: Allen 
    Last Name: McBride 
    Birth Year: 1967 
    County: Cook 
    State: Illinois 

은 가능한 어떤 .txt 인을 이끌 수있는, 내가 어떻게로드합니다 스타 타에?

또한이 두 가지 예와 같이 용어의 양은 위치에 따라 다르지만 나는 항상 미국보다 2를 원합니다.

지금은 .txt에 대한 테이블의 각 변수 주위에 ""를 넣고 있습니다.

"Allen","Von Schmidt","1965","District 1, Ocean City, Cape May, New Jersey, USA" 
"Lee Roy","McBride","1967","Precinct 5, District 2, Chicago, Cook, Illinois, USA" 

.txt를 포맷하는 더 좋은 방법이 있습니까? Stata에서 해당 변수를 어떻게 만들 수 있습니까?

도움 주셔서 감사합니다.

P. stata가 infile 또는 insheet를 사용하고 처리 할 수 ​​있거나 탭을 사용하여 변수를 구분한다는 것을 알고 있습니다. 나는 Perl에서 Location과 같은 변수를 다 긁어 모아서 ""를 추가 한 것을 모릅니다.

답변

3

두 가지 방법이 있습니다. 첫 번째는 do 파일에 데이터를 붙여 넣고 입력을 사용하는 것입니다. 포맷이 꽤 정규화되었다고 가정하면 쉼표를 사용하여 쉽게 구문을 분석하여 구문을 분석 할 수 있습니다. 내가 쉼표를 제거합니다 :

#delimit; 
input 
str100(first_name last_name yob geo); 
"Allen" "Von Schmidt" "1965" "District 1, Ocean City, Cape May, New Jersey, USA"; 
end; 

compress; 
destring, replace; 

split geo, parse(,); 

rename geo1 district; 
rename geo2 city; 
rename geo3 county; 
rename geo4 state; 
rename geo5 country; 
drop geo; 

두 번째 방법은 아마 쉽게 직접 txt 파일에서 데이터를 insheet하는 것입니다. 쉼표가 제거되지 않은 것으로 가정합니다.

#delimit; 
insheet first_name last_name yob geo using "raw_data.txt", clear comma nonames; 

그런 다음 첫 번째 예와 같이 정리하십시오.

+0

감사합니다! 업데이트 된 게시물마다 첫 번째 접근 방식에 대한 관찰이 너무 많습니다. 두번째 apporach는 compress에서 시작하는 첫번째 것을 사용합니까? 그래서, ""아무 문제 없어? 또한 이름에 공백이 있습니까? – user1690130

+0

압축으로 시작하십시오. Mac "The Knife"Gangsterson이라고 이름이 지어지는 사람이없는 한 그것은 효과가 있어야합니다. 내부 공간은 괜찮습니다. –

+0

감사합니다! 괜찮 으면 하나의 후속 조치. 나는 용어의 양이 위치에 따라 다르다는 것을 알아 챘지만, 나는 항상 USA 앞에 2를 원한다. 이 접근법은 여전히 ​​적용됩니까? – user1690130

0

이것은 완전한 대답은 아니지만 쉽게 허용되는 의견보다 많은 공간과 유연성이 필요합니다.

마지막 트릭은 요소를 끝에서 떼어내는 것을 기반으로합니다. 가장 쉬운 방법은 마지막 쉼표를 찾기 시작하는 것입니다.이 쉼표는 다시 반대로 된 문자열의 첫 번째 쉼표입니다. strpos(reverse( 문자열 바 ), ",")을 사용하십시오.

는 예를 들어 첫 번째 commma이

. di strpos("abcd,efg,h", ",") 
5 

마지막 쉼표는 마지막 요소를 벗겨 수있다이

. di strpos(reverse("abcd,efg,h"), ",") 
2 

같은 마지막 쉼표 당신이 알게되면처럼 strpos()에 의해 발견된다 . 마지막 쉼표가 역방향 문자열의 위치 #에 있으면 문자열의 # # 위치에 있습니다.

. di substr("abcd,efg,h", -2, 2) 
,h 

이 예제는 단일 문자열의 계산기 스타일 예제입니다.그러나 마지막 요소는 전체 문자열 변수에 대해 비슷하게 제거 될 수 있습니다.

. gen poslastcomma = strpos(reverse(var), ",") 
. gen var_end = substr(var, -poslastcomma, poslastcomma) 
. gen var_begin = substr(var, 1, length(var) - poslastcomma) 

일단 이런 식으로 익숙해지면 더 적은 변수로 복잡한 문장을 작성할 수 있지만 느리게, 천천히, 천천히 단계별로 배우는 것이 좋습니다.

덧붙여서, 공통적 인 Stata 학습자 오류 (내 견해로는)는 문자열 문제 에 대한 해결책은 정규 표현식의 사용을 필요로한다고 가정하는 것입니다. 정규 표현식에 매우 능숙하다면, 자연스럽게 멋진 것들을 할 수 있지만, 다른 문자열 함수는 매우 강력 할 수 있습니다.

예를 들어, "USA"와 같은 마지막 요소를 무시한 다음 뒤쪽으로 작업하는 다음 요소를 차례로 작업하려는 것처럼 들립니다.

STATA에서 split도 괜찮습니다 (나는 팬이다 실제로 그 추정 저자)하지만 분할 내가 와서 어디있는 요소의 서로 다른 숫자를 산출하면 어색 할 수 있습니다.