技术问询:如何从变量及SAS文件wildfire_narrative的文本中提取烧毁英亩数?
从SAS的wildfire_narrative文件中提取烧毁的英亩数方案
嘿,针对你要从wildfire_narrative文件的episode_narrative变量里提取烧毁英亩数的需求,我整理了两种实用的SAS实现方法,帮你搞定这个文本提取问题:
方法一:单次提取(假设每个文本段落只有一组英亩数)
如果你的episode_narrative里每个记录只包含一组烧毁英亩数,用正则表达式配合SAS的PRXMATCH和PRXCHANGE函数就能快速提取:
data wildfire_acres; set wildfire_narrative; * 定义正则表达式:匹配带逗号的数字(或纯数字)+ 英亩的模式; pattern = prxparse('/(\d{1,3}(?:,\d{3})*)英亩/'); if prxmatch(pattern, episode_narrative) then do; * 提取匹配到的数字+英亩字符串,再去掉“英亩”和逗号; acres_char = prxchange('s/(\d{1,3}(?:,\d{3})*)英亩/$1/', 1, episode_narrative); acres_num = input(compress(acres_char, ','), best12.); * 转成数值型变量; end; drop pattern acres_char; run;
代码解释:
- 正则表达式
/(\d{1,3}(?:,\d{3})*)英亩/专门匹配类似10,353英亩或1234英亩的内容,括号里的部分就是我们要提取的数字部分 PRXCHANGE用来替换掉“英亩”字样,只保留数字字符串compress(acres_char, ',')去掉数字里的逗号,再用input转成数值型,方便后续分析
方法二:循环提取(处理文本中有多组英亩数的情况)
如果有的episode_narrative段落里提到了多组英亩数(比如不同阶段的烧毁面积),可以用PRXNEXT循环遍历所有匹配结果:
data wildfire_acres_multi; set wildfire_narrative; length acres_char $20; pattern = prxparse('/(\d{1,3}(?:,\d{3})*)英亩/'); start = 1; stop = length(episode_narrative); * 循环查找所有匹配的英亩数; do while(prxnext(pattern, start, stop, episode_narrative, pos, len)); acres_char = substr(episode_narrative, pos, len); acres_num = input(compress(acres_char, ',英亩'), best12.); output; * 每个匹配结果输出一条记录; start = pos + len; end; drop pattern start stop pos len acres_char; run;
注意事项:
- 如果文本里有“约XX英亩”“近XX英亩”这类前缀,可以把正则表达式调整为
/(约|近)?(\d{1,3}(?:,\d{3})*)英亩/,按需提取前缀和数字 - 建议先抽样查看
episode_narrative的文本格式,调整正则表达式的匹配规则,确保覆盖所有可能的情况
内容的提问来源于stack exchange,提问作者bananapheet
相关产品推荐
相关产品推荐

