Stata - 使用“”输入.txt中的数据,

时间:2013-02-15 18:44:23

标签: stata

我正在使用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个。

目前,我在“.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中使用所有这些变量来修复像Location这样的变量,所以我添加了“”

2 个答案:

答案 0 :(得分:3)

有两种方法可以做到这一点。第一种是将数据粘贴到您的文件中并使用输入。假设格式相当规则,您可以使用逗号进行解析来轻松清理它。请注意,我删除了逗号:

#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;

然后按照第一个例子清理它。

答案 1 :(得分:0)

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

一个技巧是基于从末端剥离元素。最简单的方法是开始查找最后一个逗号,这反过来是反向字符串中的第一个逗号。使用strpos(reverse( stringvar ), ",")

例如,strpos()就像这样找到第一个commma

. 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”,然后依次处理向后工作的下一个元素。

Stata中的{p> split也很好(我是粉丝而且确实是它的推定作者)但如果分裂产生不同数量的元素,这可能会很尴尬,这就是我进来的地方。