SAS中如何将Description字段拆分为多行对象记录?
SAS拆分多对象描述到多行解决方案
问题原因
你之前用countw和scan拆分没成功,核心问题是:这两个SAS函数默认只支持单个字符作为分隔符,但你要用的Processed.是多字符字符串,所以会被拆成P、r、o等单个字符来分割,自然得不到想要的结果。
正确代码实现
方法1:转分隔符后拆分(简单易上手)
先把多字符的Processed.替换成一个不常用的单字符(比如|),再用熟悉的countw和scan拆分,最后保留Processed.本身:
data want; set have; /* 把每个Processed.后面加个|,方便拆分时识别段落边界 */ temp_desc = tranwrd(Description, 'Processed.', 'Processed.|'); /* 计算拆分后的段落数量 */ num_parts = countw(temp_desc, '|'); do index = 1 to num_parts; /* 提取每一段,去除首尾多余空格 */ line_part = strip(scan(temp_desc, index, '|')); /* 过滤空行(避免替换后产生无效内容) */ if line_part ne '' then output; end; drop temp_desc num_parts; run;
方法2:正则表达式拆分(适配复杂格式)
如果描述字段格式偶尔有变动(比如空格不一致),用正则表达式更稳妥,直接匹配每个Object开头的完整段落:
data want; set have; /* 编译正则规则:匹配从Object开始,到下一个Object或字符串结束的内容 */ retain re; if _n_ = 1 then re = prxparse('/Object.*?(?=Object|$)/'); start = 1; index = 0; /* 循环找出所有符合规则的段落 */ do while(prxmatch(re, Description, start)); index + 1; /* 提取匹配到的内容,去掉首尾空格 */ line_part = strip(prxposn(re, 0, Description)); output; /* 更新起始位置,继续匹配下一段 */ start = prxposn(re, 0, Description, 'end') + 1; end; drop re start; run;
效果说明
两种方法都会生成你需要的ID、index和拆分后的line_part(对应目标输出里的Description列),和你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者Miriam York
相关产品推荐
相关产品推荐

