我正在使用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这样的变量,所以我添加了“”
答案 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
也很好(我是粉丝而且确实是它的推定作者)但如果分裂产生不同数量的元素,这可能会很尴尬,这就是我进来的地方。