Stata-从.txt输入数据时,使用“输入”&引用;以及,

Stata-从.txt输入数据时,使用“输入”&引用;以及,,stata,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

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

此外,在这两个例子中,术语的数量在位置上有所不同,但我总是希望在USA之前使用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中创建相应的变量

谢谢你的帮助


另外,我知道stata使用内嵌或insheet,可以处理或制表符来分隔变量。我不知道如何在perl中使用所有这些工具刮取类似变量的位置,所以我添加了“

有两种方法可以做到这一点。第一种方法是将数据粘贴到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文件中插入数据,这可能更容易。这假定未删除逗号:

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

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

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

一个技巧是从末端剥离元素。最简单的方法是开始查找最后一个逗号,它又是反向字符串中的第一个逗号。使用strpos(反向(stringvar
),“,”

例如,第一个commma由
strpos()
找到,如下所示

. di strpos("abcd,efg,h", ",")
5
. di strpos(reverse("abcd,efg,h"), ",")
2
最后一个逗号是这样的

. 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中也很好(我是一个粉丝,而且确实是它的假定作者),但是如果一次分割产生不同数量的元素,那么可能会很尴尬,这就是我的初衷

谢谢大家!!根据更新后的帖子,我对第一种方法有太多的观察。第二种方法使用从压缩开始的第一种方法?那么,这个“”没有问题吗?中的空格也不表示名称?从compress开始。只要没有人叫麦克“刀”“Gangsterson应该行。内部空间可以。谢谢!如果可以的话,请进行一次跟进。我注意到术语的数量因位置而异,但我总是希望2先于美国。这种方法是否仍然适用?我不确定我是否完全理解。你能发布一些示例吗?足够公平。发布的示例是否有帮助?在原始数据中a、 第二个在开始的时候有一个额外的学期。谢谢你的帮助!!