分裂

问题描述:

我有一个字符串框看起来像这样在谷歌的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个字符串开始的第三个字节进行进一步计算?

最好的问候

+0

scotti - 这不是如何* worrk!你问问题 - 我们回答 - 你接受/投票等,如果你有新的问题 - 你不更新现有的问题 - 你只是问新的问题。这不是一个我们共同处理您的项目的论坛 - 这是问答网站。所以,如果你会问新的问题 - 我会很乐意回答。同时 - 正如你所说的,两个答案都是有用的和有帮助的 - 挑选一个并接受。欢迎来到*:o)当有人回答你的问题时,你可以检查该怎么做 - *.com/help/someone-answers。 –

+0

感谢您的建议,并为我的错误感到抱歉。我会把它放在心上(并提出很多新问题) – scotti

+0

没问题。继续询问是否仍然需要:o) –

下面是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');