SAS中如何将字符串数组列转为数组格式并提取首个非空值
SAS字符字段取首个非空值(类COALESCE逻辑)实现方案
函数说明
SAS原生COALESCE函数仅支持数值类型变量,处理字符型字段的首个非空值匹配,需要使用专门的字符版函数COALESCEC,如果涉及解析存储为字符串的数组/列表内容,需要配合字符串拆分函数实现。
分场景实现代码
- 场景1:逐行扫描数据集现有列,按顺序返回第一个非空字符值
适用于现有两列数据、需要按优先级取首个非空值存入新列的需求,基础实现代码如下:
/* 替换have为你的输入数据集名,want为输出数据集名 */ data want; set have; /* 按参数填写的优先级顺序,返回第一个非空、非全空格的字符值 */ first_valid_val = coalescec(Values, 第二列的列名); /* 如果字段存在前后空格干扰,启用下面的代码替换上一行,先去除前后空格再判断 */ * first_valid_val = coalescec(strip(Values), strip(第二列的列名)); run;
- 场景2:解析
Values列存储的数组/列表格式字符串,返回拆分后第一个非空元素
适用于Values列存的是类似"[a,,b,c]"、"1,3,,5"这类序列化数组字符串,需要拆分后取首个非空元素的场景,参考代码如下:
data want; set have; /* 按你实际字段的最大长度修改$后面的长度值,避免截断 */ length first_valid_val $256.; /* 先清除数组字符串里的方括号、引号等包裹符号 */ clean_str = compress(Values, '[]"'''); /* 按分隔符遍历拆分后的元素,找到第一个非空值就停止遍历 */ do i = 1 to countw(clean_str, ','); /* 如果分隔符不是逗号,修改这里的分隔符参数 */ ele = strip(scan(clean_str, i, ',')); /* 同步修改分隔符参数 */ if not missing(ele) then do; first_valid_val = ele; leave; end; end; /* 清除过程中生成的临时变量 */ drop clean_str i ele; run;
注意事项
如果你的列表字符串使用的分隔符不是逗号(比如空格、|、分号),把
countw和scan函数里的分隔符参数替换为实际分隔符即可;如果空值是由全空格组成的字符串,必须搭配strip()函数去除前后空格后再做非空判断,否则SAS会将全空格字符串识别为非空值。
内容的提问来源于stack exchange,提问作者Vikas Madoori
相关产品推荐
相关产品推荐

