Stata中如何删除字符串变量冒号后前两位数字?
解决Stata中字符串变量的年份截断问题
我来帮你搞定这个字符串处理的需求!你的变量cn格式是[前缀]:[四位年份]-cv-[案件号],要去掉冒号后的前两位年份数字,下面给你两种靠谱的实现方法,还会解释你之前用substr报错的可能原因。
方法一:正则表达式(推荐,灵活通用)
用regexr()函数可以精准匹配并替换目标部分,适合这种有固定模式的字符串:
gen cn_new = regexr(cn, ":(\d{2})(\d{2})", ":\\2")
代码解释:
":(\d{2})(\d{2})":匹配冒号:后面的四位数字,把它们分成两个捕获组——第一个(\d{2})是前两位年份,第二个(\d{2})是后两位年份":\\2":替换成冒号加上第二个捕获组的内容,也就是保留后两位年份
方法二:用strpos+substr组合(适合格式完全固定的场景)
如果你确定所有字符串的冒号位置是固定的(或者前缀长度不固定但想精准定位),可以先用strpos找到冒号的位置,再拼接前后部分:
* 第一步:定位冒号的位置 gen colon_pos = strpos(cn, ":") * 第二步:拼接结果:冒号前的内容 + 冒号 + 冒号后第3位开始的所有内容 gen cn_new = substr(cn, 1, colon_pos) + substr(cn, colon_pos + 3, .)
为什么你之前用substr报错?
大概率是没正确计算起始位置!比如如果直接写死起始位置,遇到前缀长度变化(比如有的前缀是1位,有的是2位)就会出错,而用strpos动态获取冒号位置,不管前缀多长都能正确截取。
测试示例
你可以用下面的测试代码验证效果:
clear input str20 cn "1:2013-cv-10153" "0:1979-cv-06704" end * 正则方法 gen cn_regex = regexr(cn, ":(\d{2})(\d{2})", ":\\2") * substr方法 gen colon_pos = strpos(cn, ":") gen cn_substr = substr(cn, 1, colon_pos) + substr(cn, colon_pos + 3, .) list
运行后你会看到两个方法都能得到1:13-cv-10153和0:79-cv-06704的正确结果。
内容的提问来源于stack exchange,提问作者caceves
相关产品推荐
相关产品推荐

