在Google Sheets中基于指定顺序排序逗号分隔字符串
根据预定义偏好顺序对逗号分隔字符串排序的Excel解决方案
需求说明
给定一个预定义的逗号分隔偏好顺序字符串,需要对目标逗号分隔字符串重新排序:
- 优先保留偏好列表中的项,并严格按照偏好顺序排列
- 不在偏好列表中的项,统一放在结果的末尾,保持它们在原输入中的相对顺序
假设条件
- 预定义偏好顺序存放在单元格
$E$2,值为:red, orange, yellow, green, blue, dark blue, light blue, indigo, violet - 待排序的输入字符串存放在目标单元格(如例子中的
A2、A3)
公式实现
将以下公式输入到输出单元格(如例子中的 B2),按回车即可得到结果:
=TEXTJOIN(", ", TRUE, FILTER(TRIM(MID(SUBSTITUTE($E$2, ",", REPT(" ", 99)), (ROW(INDIRECT("1:"&LEN($E$2)-LEN(SUBSTITUTE($E$2, ",", ""))+1))-1)*99+1, 99)), ISNUMBER(SEARCH(", "&TRIM(MID(SUBSTITUTE($E$2, ",", REPT(" ", 99)), (ROW(INDIRECT("1:"&LEN($E$2)-LEN(SUBSTITUTE($E$2, ",", ""))+1))-1)*99+1, 99))&",", ", "&A2&", "))), TEXTJOIN(", ", TRUE, FILTER(TRIM(MID(SUBSTITUTE(A2, ",", REPT(" ", 99)), (ROW(INDIRECT("1:"&LEN(A2)-LEN(SUBSTITUTE(A2, ",", ""))+1))-1)*99+1, 99)), ISERROR(SEARCH(", "&TRIM(MID(SUBSTITUTE(A2, ",", REPT(" ", 99)), (ROW(INDIRECT("1:"&LEN(A2)-LEN(SUBSTITUTE(A2, ",", ""))+1))-1)*99+1, 99))&",", ", "&$E$2&", ")))))
公式拆解
公式分为两个核心部分,用TEXTJOIN拼接最终结果:
偏好匹配项排序
- 先将偏好字符串拆分为单个项的数组:
TRIM(MID(SUBSTITUTE($E$2, ",", REPT(" ", 99)), ...)),通过重复空格拆分长字符串,再截取每个项并去除多余空格 - 用
ISNUMBER(SEARCH(", "&项&",", ", "&A2&", "))精准判断项是否存在于输入字符串中(前后加逗号避免部分匹配,比如区分blue和dark blue) - 用
FILTER筛选出存在的项,按偏好顺序保留后合并
- 先将偏好字符串拆分为单个项的数组:
非偏好项追加
- 同理拆分输入字符串为数组
- 用
ISERROR(SEARCH(", "&项&",", ", "&$E$2&", "))筛选出不在偏好列表中的项 - 保留这些项在原输入中的相对顺序,合并后追加到偏好匹配项的末尾
例子验证
- 例子1:输入
orange, indigo, green→ 输出orange, green, indigo,完全匹配偏好顺序中的对应项排列 - 例子2:输入
chicken, orange, violet, dark blue, blue, light blue→ 输出orange, blue, dark blue, light blue, violet, chicken,偏好项按顺序排列,chicken作为非偏好项放在末尾
注意事项
- 公式中的
", "是分隔符,如果输入输出使用无空格的逗号(如orange,indigo,green),请将公式中所有", "替换为"," - 该公式适用于Excel 365/2021及以上版本,需支持
TEXTJOIN、FILTER等动态数组函数 - 若使用旧版Excel,可通过数组公式或VBA实现类似逻辑
内容的提问来源于stack exchange,提问作者MMsmithH
相关产品推荐
相关产品推荐

