1

我正在使用 perl 通过 .txt 抓取以下内容,最终将其引入 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 可能会导致这种情况,我将如何将其加载到 Stata 中?

此外,在这 2 个示例中,位置的术语数量各不相同,但我总是希望 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 中创建相应的变量?

谢谢您的帮助!

PS 我知道 stata 使用 infile 或 insheet 并且可以处理 , 或制表符来分隔变量。我不知道如何用所有这些在 perl 中刮取像 Location 这样的变量,所以我添加了“”

4

2 回答 2

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;

然后像第一个例子一样清理它。

于 2013-02-15T22:38:12.533 回答
0

这不是一个完整的答案,但我需要比评论(容易)允许的更多空间和灵活性。

一种技巧是从最后剥离元素。最简单的方法可能是开始寻找最后一个逗号,这又是反转字符串中的第一个逗号。使用strpos(reverse(字符串变量), ",")

例如,第一个逗号是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 中也很好(我是一个粉丝,并且确实是它的假定作者)但是如果拆分产生不同数量的元素可能会很尴尬,这就是我进来的地方。

于 2013-02-17T14:30:52.260 回答