分裂

2017-10-05 161 views
1

我有一個字符串框看起來像這樣在谷歌的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 - 這不是如何stackoverflow worrk!你問問題 - 我們回答 - 你接受/投票等,如果你有新的問題 - 你不更新現有的問題 - 你只是問新的問題。這不是一個我們共同處理您的項目的論壇 - 這是問答網站。所以,如果你會問新的問題 - 我會很樂意回答。同時 - 正如你所說的,兩個答案都是有用的和有幫助的 - 挑選一個並接受。歡迎來到StackOverflow:o)當有人回答你的問題時,你可以檢查該怎麼做 - stackoverflow.com/help/someone-answers。 –

+0

感謝您的建議,併爲我的錯誤感到抱歉。我會把它放在心上(並提出很多新問題) – scotti

+0

沒問題。繼續詢問是否仍然需要:o) –

回答

0

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

這是一個應該幫助的例子。它會生成兩列,它們對字節有不同的解釋:其中一個(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');