昨天我們知道了,當 jq 處理資料的主程式寫的愈來愈多,流程比較複雜的時候,除了寫成一長串的字串表達式,我們還可以將 jq 主程式獨立寫在 .jq 檔案裡面;並且在 .jq 檔案裡面,我們可以透過 "vscode" IDE + 安裝 "jq Syntax Highlighting" 這個擴充套件,在更容易開發的環境下寫 jq 主程式。今天我們更進一步,繼續提取函式吧。
顯示蒲福風級的表達式是 ((.maxWindSpeed|tonumber) as $speed|$wind[]|select($speed>=.min and $speed<.max)|.level)
,但要提取函式,我們會需要知道這個表達式所在的位置有怎樣的輸入。
我們在 Day24: 認識 generator 概念,有提到"逐筆 AnalysisData 的整理",其中 "要顯示的資料內容" 如下:
[
.fixTime[0:13],
separate(.coordinate)[0],
separate(.coordinate)[1],
.pressure,
((.maxWindSpeed|tonumber) as $speed|$wind[]|select($speed>=.min and $speed<.max)|.level),
((.maxGustSpeed|tonumber) as $speed|$wind[]|select($speed>=.min and $speed<.max)|.level),
$direction[.movingDirection],
.movingPrediction[0].value
]
還記得 generator 的概念是一個產生多個輸出的過濾器。所以 generator ,
連接的字串,都是來自同一個輸入,也就是組這段字串陣列前的 |
前面的表達式 "山陀兒路徑資料中的最近五筆 AnalysisData"。
❗如果在這個時候,忘記了 "山陀兒路徑資料中的最近五筆 AnalysisData" 是長怎樣,會怎麼做呢? |
---|
💡前面有使用 generator .[] 逐一取得AnalysisData,所以可以用 keys 看看物件有哪些內容 |
❗可是前後的表達式都寫好了,這時候要怎麼使用 keys ,而盡量不用動到已經寫好的程式呢? |
---|
💡jq 有內建 debug 函式可以使用 🎉 |
debug
函式debug
函式不帶參數,會直接用["DEBUG", ...]
的形式於終端機印出其 |
前的輸出內容;debug(filter)
帶參數則會輸出套用 filter 到其 |
前的輸出的內容喔。因此我們可以在 main.jq
加入debug(keys)
來看看 "山陀兒路徑資料中的最近五筆 AnalysisData" 是長怎樣,如下
.analysisData.fix[-5:][] | debug(keys) |
[
(略),
((.maxWindSpeed|tonumber) as $speed|$wind[]|select($speed>=.min and $speed<.max)|.level),
(略)
]
如此一來,能在(盡量)不改變我們原有的程式碼的狀況下,查看忘記了的內容。
❗確認想看的資料看完之後, 記得移除 debug 。 |
---|
目前看來,雖然這個位置拿得到變數 $wind
,但輸入的 analysisData 不包含變數 $wind
。因此提取蒲福風級的函式,函式除了第一個參數,欄位.maxWindSpeed
與.maxGustSpeed
通用,也要有第二參數 $wind
,才能滿足原本表達式。所以我們整理函式如下:
def beaufort(f; wind_array):
(f|tonumber) as $speed |
wind_array[] |
select($speed>=.min and $speed<.max)|
.level;
提取完的函式先放在 main.jq
的上方,可以參考程式碼。
今天我們一步步的提取顯示蒲福風級函式,並且在過程中認識了內建的 debug
函式。 debug
函式能在不影響原本程式碼的情況下,只要安排它在你想查看輸入/輸出的位置,就可以檢視處理的資料在過程中的樣子,很實用喔!
感謝自己,今天也很認真學習 😊