【发布时间】:2021-11-22 03:40:59
【问题描述】:
基本上我需要拆分 json 字符串并选择特定属性(在 unnest 之后)
键和值未知{"date":"2011-01-01","ok_key":"ok_value","ok_key2":"value2","key3":"no_okay,str_2"}
我试过了:
- 用逗号分割,因为字符串中有逗号,所以不起作用
- 使用正则表达式替换字符串中的逗号,但大查询中的 RE2 实现没有 支持后视
我现在有一个替代方案:
replace(json_query(attributes,"$"), '","', '"|separator|"')
创建我自己的分隔符来替换“好”逗号,然后我可以使用我定义的这个分隔符进行拆分..
有没有办法替换 Big Query 中双引号之间的逗号?只是好奇。
所需的输出是 2 个字符串列:
Col_Key、Col_Value
“日期”、“2011-01-01”
“ok_key”、“ok_value”
"ok_key2","value2"
"key3", "no_okay,str_2"
我现在的解决方法是
split(translate(replace(json_query(bada_json_str,"$"), '","', '"|separator|"'),"{}",""),'|separator|')
它不能完美运行,因为 JSON 值说 INT 类型可能没有双引号括起来
【问题讨论】:
-
预期的输出是什么?另外,你事先知道键名吗?
-
每当你给出一个例子时,请展示你想要的结果。这对你来说可能很清楚,但对读者来说可能不是。你想用不在双引号内的逗号分割字符串吗?
-
要将字符串拆分为不在双引号内的逗号,您可以匹配以下正则表达式:
(?:^|,)([^,"]*(?:(?:"[^"]*")[^,"]*)*)(?=,|$)。不在引用字符串中的逗号之间的匹配被保存到捕获组 1。Demo... -
...对于您的示例,来自捕获组 1 的匹配如下:
{"date":"2011-01-01"、"ok_key":"ok_value"、"ok_key2":"value2"和"key3":"no_okay,str_2"}。将光标悬停在链接上的正则表达式的某些部分上以获取其功能的描述。只要支持积极的前瞻,这应该可以工作。 -
谢谢,这正是重点。 Big Query RE2 实现不支持前瞻后瞻。我用笨拙的替换“好”逗号和“好冒号”解决了
标签: regex google-bigquery