如何不使用parse函数从键值对分隔文本生成对应列?
不用parse函数实现键值对转列的方案
我的输入包含一个带有分隔文本的字段,格式为列名后跟“=”再跟对应值。我希望以“=”前的内容作为列名,“=”后的内容作为值来创建列,请问有没有办法不使用parse函数实现这个需求?
可以通过字符串处理+JSON解析+动态对象展开的组合方式实现,完全不需要用到parse函数。以下是基于Kusto Query Language(KQL)的实现代码:
let Traces = datatable(EventText:string) [ "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)", "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=02/17/2016 08:40:00, previousLockTime=02/17/2016 08:39:00)", "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)", "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)", "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)" ]; Traces | project data = replace_string(extract(@"\(([^\)]+)", 1, EventText), "=", ":") | extend data = parse_json(data) | evaluate bag_unpack(data)
步骤说明:
- 提取目标内容:使用
extract函数配合正则表达式\(([^\)]+),从EventText中提取括号内的所有键值对文本。 - 转换为JSON格式:用
replace_string把所有=替换为:,将原有的key=value格式转换为JSON兼容的key:value结构。 - 解析为动态对象:通过
parse_json将格式化后的字符串转换为KQL的动态类型(JSON bag)。 - 展开为列:使用
evaluate bag_unpack(data)将动态对象中的每个键值对展开为独立的列,键名作为列名,对应值作为列数据。
内容的提问来源于stack exchange,提问作者user8369515
相关产品推荐
相关产品推荐

