在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
相关产品推荐
相关产品推荐

