2013-02-15 36 views
1

我正在使用perl通過.txt刮取以下內容,我最終將其帶入Stata。什麼格式選項有效?我有很多這樣的觀察,所以想用一種我可以概括的方法。Stata - 從.txt輸入數據與「」和,

原始數據的格式爲:

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和我將如何加載它變成Stata?

此外,在這兩個例子中,術語數量在位置上有所不同,但我總是希望在美國之前使用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.S.我知道stata使用infile或insheet,並且可以處理,或製表符來分隔變量。我不知道如何在perl中添加所有這些變量,所以我添加了「」

回答

3

有兩種方法可以做到這一點。首先是將數據粘貼到do-file並使用輸入。假設格式相當規整,你可以使用逗號來輕鬆清理它們以解析。請注意,我刪除了逗號:

#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文件直接插入數據,這可能更容易。這假設逗號未被刪除:

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

然後清理它,如第一個例子。

+0

謝謝!根據更新後的文章,我對第一種方法有太多觀察。第二個apporach使用第一個壓縮開始?那麼,「」是沒有問題的?名稱中的空格也不是? – user1690130 2013-02-15 22:55:27

+0

從壓縮開始。只要沒有人叫Mac「刀」Gangsterson它應該工作。內部空間正常。 – 2013-02-16 02:50:25

+0

謝謝!一個後續如果這是好的。我注意到,地點的條款數量有所不同,但我總是希望2美國之前。這種方法仍然適用嗎? – user1690130 2013-02-16 18:49:47

0

這不是一個完整的答案,但我需要更多的空間和靈活性比評論(容易)允許。

一個訣竅是基於從最終剝離元素。最簡單的方法可能是開始查找最後一個逗號,而這又是反轉字符串中的第一個逗號。使用strpos(reverse( stringvar ), ",")

例如第一commma由strpos()發現這樣

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

和最後一個逗號這樣

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

一旦你知道最後一個逗號是可以剝離的最後一個元素。如果最後一個逗號位於反轉字符串中的位置#處,則位於字符串中的位置#處。

. 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」),然後依次處理倒退的下一個元素。

split在Stata是罰款太(我是一個球迷,實際上是其公認的作者),但如果分裂產生元素的不同數字,這就是我來到可勁兒。