You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在BigQuery列中基于键提取值:提取startDate字段方案

问题描述

我有如下格式的键值对数据(非JSON格式):

Attributes
Country:US, Eligibility:Yes, startDate:2022-08-04
Country:CA, Eligibility:Yes, startDate:2021-12-01
Country:IN, Eligibility:No, startDate:2019-11-07

希望仅从Attributes字段中提取startDate,预期输出如下:

Attributes_startDate
2022-08-04
2021-12-01
2019-11-07

我曾尝试将Attributes列转换为JSON格式(首尾添加{}、为键值添加双引号)来提取startDate,但不想依赖正则表达式,是否有更有效的解决方案?

解决方案

可以通过字符串分割+键值对匹配的方式实现,完全不需要正则表达式,逻辑直观且兼容性强,以下分两种常用场景给出具体实现:

1. 编程语言(以Python为例)

通过分层分割字符串,精准定位startDate对应的值:

# 模拟读取的原始数据行
raw_data = [
    "id | Attributes",
    "---|---------------------------------------------------",
    "12 | Country:US, Eligibility:Yes, startDate:2022-08-04",
    "33 | Country:CA, Eligibility:Yes, startDate:2021-12-01",
    "11 | Country:IN, Eligibility:No, startDate:2019-11-07"
]

# 输出结果表头
print("id | Attributes_startDate")
print("---|----------------------")

# 遍历处理数据行(跳过前两行表头和分隔线)
for line in raw_data[2:]:
    # 分割id和Attributes字段,去除多余空格
    id_part, attrs_content = [part.strip() for part in line.split("|")]
    # 将Attributes拆分为单个键值对
    key_value_pairs = attrs_content.split(", ")
    # 查找startDate对应的值
    target_date = ""
    for kv in key_value_pairs:
        # 只分割一次冒号,避免值中包含冒号的情况
        key, value = kv.split(":", 1)
        if key == "startDate":
            target_date = value
            break
    # 输出该行结果
    print(f"{id_part} | {target_date}")

2. SQL查询(以MySQL为例)

利用字符串截取函数嵌套实现,无需正则:

SELECT 
    id,
    SUBSTRING_INDEX(
        SUBSTRING_INDEX(Attributes, 'startDate:', -1),
        ',', 1
    ) AS Attributes_startDate
FROM your_table_name;

逻辑说明:先截取startDate:之后的所有内容,再截取第一个逗号之前的部分,即可得到目标日期。

这种方案的优势:

  • 完全脱离正则依赖,代码/查询逻辑易懂
  • 适配多数同格式的键值对数据,可轻松扩展提取其他字段
  • 处理效率稳定,不会出现正则匹配的边界问题

内容的提问来源于stack exchange,提问作者Sri Bharath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:05:25