使用 Qlik Regex 组织混乱的评论字段
Source: Dev.to
自由文本字段既是福也是祸。
它们为用户提供了灵活性,但从报表的角度来看,这些字段往往杂乱、格式不统一,且难以处理。在本例中,客户有一个 Comments(评论)字段,用户手动输入信息,其中包含了他们在报表中需要的特定代码。
表面上的需求很简单:
从自由文本评论字段中提取代码。
但实际操作中……并不那么简单。
问题
源字段大致如下:
"Breakdown reported – REF12345 vehicle unavailable"
"Job completed ABC 67890 no further action"
"Awaiting parts – no reference provided"
代码的规则是一致的:
- 3 个大写字母
- 可选空格
- 5 位数字
有效代码示例:
ABC12345ABC 12345
挑战在于:
- 代码可能出现在文本的任何位置。
- 有些记录根本不包含代码。
- 我们需要一个干净的输出,以便进行过滤和分析。
为什么使用正则表达式?
你可以尝试使用 Mid()、Left() 或 Index() 等字符串函数来解决,但当出现以下情况时,这种方法很快就会失效:
- 代码的位置不固定。
- 空格不一致。
- 文本中噪音很多。
正则表达式(regex)正是为这种模式匹配而设计的。
解决方案
下面是我使用的表达式:
Coalesce(
Replace(
ExtractRegEx(
[Comments],
'[A-Z]{3}\s?\d{5}',
1
),
' ',
''
),
'NOT FOUND'
)
步骤 1:使用 ExtractRegEx 提取代码
ExtractRegEx(
[Comments],
'[A-Z]{3}\s?\d{5}',
1
)
正则模式
[A-Z]{3}→ 恰好 3 个大写字母\s?→ 可选空格\d{5}→ 恰好 5 位数字
这告诉 Qlik:“找出第一个出现的三个字母后跟五个数字的组合,空格可有可无。”
如果没有匹配项,ExtractRegEx() 会返回 NULL。
步骤 2:去除空格(如果存在)
Replace(…, ' ', '')
如果原始文本是 ABC 12345,此步骤会将其转换为 ABC12345。
输出始终保持一致,这对后续的连接、过滤和比较至关重要。
步骤 3:使用 Coalesce 处理缺失的代码
Coalesce(…, 'NOT FOUND')
当不存在匹配的代码时,ExtractRegEx() 返回 NULL。将所有内容包装在 Coalesce() 中,可将这些 NULL 替换为有意义的值:NOT FOUND。这样可以让结果:
- 更易于用户理解
- 更易于在应用中进行过滤
- 对下游逻辑更安全
最终结果
| 评论文本 | 提取的代码 |
|---|---|
| Breakdown reported – REF12345 vehicle unavailable | REF12345 |
| Job completed ABC 67890 no further action | ABC67890 |
| Awaiting parts – no reference provided | NOT FOUND |
干净、一致,随时可用于分析。
为什么这很重要
在 Qlik 中使用正则表达式可以让你:
- 从非结构化文本中提取结构化数据
- 减少手动数据清洗工作
- 构建更可靠的 KPI 和维度
- 优雅地处理真实世界中混乱的用户输入
如果你需要处理评论、备注、描述或参考字段,正则表达式是可以加入 Qlik 工具箱的最强大工具之一。