分裂
我有一个字符串框看起来像这样在谷歌的BigQuery:分裂
S,0,2B3,8,C2 B3 00 00 00 00 03 DE
小号,0,3FA,6,00 E0 A5 04 00 0B
S,0,440,8 80 40 4E 00 A5 47 00 64
S,0,450,8,89 50 01 12 01 19 01 B3
S,0,4B0,8,80 B0 4E A5 00 43 00 64
我的目标是提取最后的8个字节(例如80 40 4E A5 00 47 00 64 )。可能只有那些以83和84开头的。 我没有得到它与分裂,修剪,包含或regexp_extract工作。 如果有人能帮助我,我会很开心。 问候
/编辑 谢谢都非常为您的解决方案!这有助于很多。
#standardSQL
SELECT
*
FROM (
SELECT
timestamp,
REGEXP_EXTRACT(CAN_Frame, r', ([^,]+)$') AS bytes_string,
FROM_HEX(REPLACE(REGEXP_EXTRACT(CAN_Frame, r', ([^,]+)$'), ' ', '')) AS bytes
FROM `data.source`
)
WHERE SUBSTR(bytes, 1, 1) IN (b'\x83', b'\x84')
ORDER BY timestamp DESC
LIMIT 8000
给我
行时间戳bytes_string字节
1 2017年9月29日14时31分02秒84 UTC 10 00 25 00 21 00 4F hBAAJQAhAE8 =
2 2017-09-29 14:30:42 UTC 83 80 00 01 00 03 00 0D g4AAAQADAA0 =
3 2017-09-29 14:30:40 UTC 84 B2 00 27 00 08 00 03 hLIAJwAIAAM =
#standardSQL
SELECT
timestamp,
TRIM(SPLIT(CAN_Frame)[OFFSET(4)]) AS bytes
FROM
`data.source`
WHERE
LENGTH(CAN_Frame) > 1 and
SUBSTR(TRIM(SPLIT(CAN_Frame)[OFFSET(4)]),1,2) IN ('83', '84')
ORDER BY
timestamp DESC
LIMIT
8000
给我
行时间戳字节
1 2017年9月29日14时31分02秒84 UTC 10 00 25 00 21 00 4F
2 2017-09-29 14:30:42 UTC 83 80 00 01 00 03 00 0D
3 2017年9月29日14时30分四十〇秒UTC 84 00 B2 27 00 08 00 03
是有可能获得从仅与83开始,获得第四的bytes_string第六和第七字节和从第84个字节开始的第5个字节和从第83个字节开始的第8个字节以及从第84个字符串开始的第三个字节进行进一步计算?
最好的问候
下面是BigQuery的StandardSQL
#standardSQL
WITH `yourTable` AS (
SELECT 'S,0,2B3,8, C2 B3 00 00 00 00 03 DE' AS frame UNION ALL
SELECT 'S,0,3FA,6, 00 E0 04 A5 00 0B' UNION ALL
SELECT 'S,0,440,8, 80 40 4E A5 00 47 00 64' UNION ALL
SELECT 'S,0,450,8, 89 50 01 12 01 19 01 B3' UNION ALL
SELECT 'S,0,4B0,8, 80 B0 4E A5 00 43 00 64'
)
SELECT frame, TRIM(SPLIT(frame)[OFFSET(4)]) AS bytes
FROM `yourTable`
WHERE SUBSTR(TRIM(SPLIT(frame)[OFFSET(4)]), 1, 2) IN ('80', 'C2')
这是一个应该帮助的例子。它会生成两列,它们对字节有不同的解释:其中一个(bytes_string
)只是您显示的字符串的末尾,而另一个(bytes
)是转换为实际BYTES
类型的字节字符串。在BigQuery的UI,确保取消选择在“显示选项”“使用传统的SQL”或包括#standardSQL
指令:
#standardSQL
WITH Frames AS (
SELECT 'S,0,2B3,8, C2 B3 00 00 00 00 03 DE' AS frame UNION ALL
SELECT 'S,0,3FA,6, 00 E0 04 A5 00 0B' UNION ALL
SELECT 'S,0,440,8, 80 40 4E A5 00 47 00 64' UNION ALL
SELECT 'S,0,450,8, 89 50 01 12 01 19 01 B3' UNION ALL
SELECT 'S,0,4B0,8, 80 B0 4E A5 00 43 00 64'
)
SELECT
frame,
REGEXP_EXTRACT(frame, r', ([^,]+)$') AS bytes_string,
FROM_HEX(REPLACE(REGEXP_EXTRACT(frame, r', ([^,]+)$'), ' ', '')) AS bytes
FROM Frames;
下面是一个说明在bytes
柱过滤,只包括值开始\x83
另一个例子或\x84
(这将返回一个空的结果集为您提供的样本数据):
#standardSQL
WITH Frames AS (
SELECT 'S,0,2B3,8, C2 B3 00 00 00 00 03 DE' AS frame UNION ALL
SELECT 'S,0,3FA,6, 00 E0 04 A5 00 0B' UNION ALL
SELECT 'S,0,440,8, 80 40 4E A5 00 47 00 64' UNION ALL
SELECT 'S,0,450,8, 89 50 01 12 01 19 01 B3' UNION ALL
SELECT 'S,0,4B0,8, 80 B0 4E A5 00 43 00 64'
)
SELECT
*
FROM (
SELECT
frame,
REGEXP_EXTRACT(frame, r', ([^,]+)$') AS bytes_string,
FROM_HEX(REPLACE(REGEXP_EXTRACT(frame, r', ([^,]+)$'), ' ', '')) AS bytes
FROM Frames
)
WHERE SUBSTR(bytes, 1, 1) IN (b'\x83', b'\x84');
scotti - 这不是如何* worrk!你问问题 - 我们回答 - 你接受/投票等,如果你有新的问题 - 你不更新现有的问题 - 你只是问新的问题。这不是一个我们共同处理您的项目的论坛 - 这是问答网站。所以,如果你会问新的问题 - 我会很乐意回答。同时 - 正如你所说的,两个答案都是有用的和有帮助的 - 挑选一个并接受。欢迎来到*:o)当有人回答你的问题时,你可以检查该怎么做 - *.com/help/someone-answers。 –
感谢您的建议,并为我的错误感到抱歉。我会把它放在心上(并提出很多新问题) – scotti
没问题。继续询问是否仍然需要:o) –