q(KX)语言解析XML完成扁平化后无法提取数据该如何解决
q(KX)语言XML解析提取解决方案
你现有代码的file2: enlist file2存在逻辑错误,引用了未赋值的自身变量,无需做多余的enlist操作。以下是两种可落地的解析方案:
- 方案一:内置XML解析函数(推荐,适配kdb+ 3.4及以上版本)
内置.Q.xml函数可直接将XML字符串转为嵌套字典结构,无需手动处理标签匹配,代码如下:
/ 读取XML文件为单个连续字符串 xml_str: raze read0 `:File.xml / 解析XML为嵌套字典 xml_dict: .Q.xml xml_str / 提取food节点并转为结构化表格 food_tbl: flip value each xml_dict[`breakfast_menu;`food] / 可选:清理description字段的多余空白字符 food_tbl: update trim description from food_tbl
解析完成后可直接通过表格操作提取所需内容,例如:
提取所有餐品名称:
food_tbl[name]`筛选定价低于7美元的餐品:
select from food_tbl where price like "$6.*" or price like "$5.*"筛选卡路里低于800的餐品:
select from food_tbl where "I"$calories < 800方案二:正则匹配提取(兼容低版本kdb+)
如果使用的kdb+版本不支持内置XML解析,可通过正则匹配提取标签内容:
/ 读取XML文件为单个连续字符串 xml_str: raze read0 `:File.xml / 匹配提取所有<food>节点内容块 food_pat: "<food>(.*?)</food>" food_blocks: raze (1 _) each xml_str ssr food_pat / 定义字段提取函数 get_field: {[block;field] trim first block ssr ("<",string field,">(.*?)</",string field,">")} / 遍历所有块生成结构化表格 food_tbl: flip `name`price`description`calories ! get_field[;] each/[food_blocks;`name`price`description`calories]
两种方案最终都会生成结构化的表格数据,可直接按业务需求做后续计算、筛选操作。
内容的提问来源于stack exchange,提问作者Jim Macaulay
相关产品推荐
相关产品推荐

