Share via


parse-where 運算子

評估字串運算式,並將其值剖析至一或多個計算的資料行。 結果只會是成功剖析的字串。

parse-where 剖析字串的方式與剖析相同,並篩選出未成功剖析的字串。

請參閱剖析運算子,這會針對未成功剖析的字串產生 Null。

語法

T| parse-where [kind [kind=regexFlags]] 表達式with* (stringConstantcolumnName [:flags=columnType]) *...

深入瞭解 語法慣例

參數

名稱 類型 必要 Description
T string ✔️ 要剖析的表格式輸入。
種類 string ✔️ 其中一個 支援的種類值。 預設值是 simple
regexFlags string 如果 kindregex,則您可以指定 regex 旗標,例如 U 用於非greedy、 m 多行模式、 s 比對新行 \n,以及 i 不區分大小寫。 您可以在 [旗標] 中找到更多旗標。
expression string ✔️ 評估為字串的表達式。
stringConstant string ✔️ 要搜尋和剖析的字串常數。
columnName string ✔️ 要指派值的數據行名稱,從字串表達式擷取。
columnType string 指示要將值轉換成何種型別的純量值。 預設為 string

注意

  • 如果您也想要捨棄或重新命名某些資料行,請使用 project
  • * 模式中使用 來略過垃圾郵件值。 這個值無法在數據行之後 string 使用。
  • 除了 StringConstant 之外,剖析模式可能會以 ColumnName 為開頭。
  • 如果剖析的 表達式 不是 類型 string,則會轉換成 類型 string

支援的種類值

Text 描述
simple 這是預設值。 stringConstant 是一般字串值,且相符項目嚴格。 所有字串分隔符號都應出現在剖析字串中,而所有擴展資料行皆必須與要求的型別相符。
regex stringConstant 可能是正則表達式,且比對嚴格。 所有字串分隔符號 (可以是此模式的規則運算式) 都應出現在剖析字串中,而所有擴展資料行皆必須與要求的型別相符。

Regex 模式

在 regex 模式中,剖析會將模式轉譯為 regex,並使用 正則表達式 來執行比對,並使用內部處理的編號擷取群組。 例如:

parse-where kind=regex Col with * <regex1> var1:string <regex2> var2:long

剖析在內部產生的 RegEx 是 .*?<regex1>(.*?)<regex2>(\-\d+)

  • * 已翻譯成 .*?
  • string 已翻譯成 .*?
  • long 已翻譯成 \-\d+

傳回

輸入資料表,根據提供給運算子的資料行清單進行擴充。

注意

輸出中只會有成功剖析的字串。 不符合模式的字串將會被篩選掉。

範例

parse-where 運算子可讓您在相同的 string 運算式上使用多個 extract 應用程式,以簡化 extend 資料表的方式。 當資料表的 string 資料行包含多個您想要細分為個別資料行的值時,這個就非常有用。 例如,您可以拆解 developer trace ("printf"/"Console.WriteLine") 陳述式產生的資料行。

使用 parse

在下列範例中,Traces 資料表的 EventText 資料行包含 Event: NotifySliceRelease (resourceName={0}, totalSlices= {1}, sliceNumber={2}, lockTime={3}, releaseTime={4}, previousLockTime={5}) 形式的字串。 下列作業將會以六個資料行來擴充資料表:resourceNametotalSlicessliceNumberlockTimereleaseTimepreviousLockTimeMonthDay

有些字串沒有完全相符。

使用 parse 時,計算結果欄會有 Null。

let Traces = datatable(EventText: string)
    [
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=invalid_number, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=invalid_datetime, previousLockTime=02/17/2016 08:39:00)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=invalid_number, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces  
| parse EventText with * "resourceName=" resourceName ", totalSlices=" totalSlices: long * "sliceNumber=" sliceNumber: long * "lockTime=" lockTime ", releaseTime=" releaseTime: date "," * "previousLockTime=" previouLockTime: date ")" *  
| project
    resourceName,
    totalSlices,
    sliceNumber,
    lockTime,
    releaseTime,
    previouLockTime

輸出

resourceName totalSlices sliceNumber lockTime releaseTime previousLockTime
PipelineScheduler 27 20 02/17/2016 08:40:01 2016-02-17 08:40:01.0000000 2016-02-17 08:39:01.0000000
PipelineScheduler 27 22 02/17/2016 08:41:01 2016-02-17 08:41:00.0000000 2016-02-17 08:40:01.0000000

使用 parse-where

使用 'parse-where' 將會從結果中篩選掉未成功剖析的字串。

let Traces = datatable(EventText: string)
    [
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=invalid_number, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=invalid_datetime, previousLockTime=02/17/2016 08:39:00)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=invalid_number, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces  
| parse-where EventText with * "resourceName=" resourceName ", totalSlices=" totalSlices: long * "sliceNumber=" sliceNumber: long * "lockTime=" lockTime ", releaseTime=" releaseTime: date "," * "previousLockTime=" previousLockTime: date ")" *  
| project
    resourceName,
    totalSlices,
    sliceNumber,
    lockTime,
    releaseTime,
    previousLockTime

輸出

resourceName totalSlices sliceNumber lockTime releaseTime previousLockTime
PipelineScheduler 27 20 02/17/2016 08:40:01 2016-02-17 08:40:01.0000000 2016-02-17 08:39:01.0000000
PipelineScheduler 27 22 02/17/2016 08:41:01 2016-02-17 08:41:00.0000000 2016-02-17 08:40:01.0000000

使用 RegEx 旗標的 RegEx 模式

若要取得 resourceName 和 totalSlices,請使用下列查詢:

let Traces = datatable(EventText: string)
    [
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=non_valid_integer, sliceNumber=11, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=02/17/2016 08:40:00, previousLockTime=02/17/2016 08:39:00)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=non_valid_integer, sliceNumber=44, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces
| parse-where kind = regex EventText with * "RESOURCENAME=" resourceName "," * "totalSlices=" totalSlices: long "," *
| project resourceName, totalSlices

輸出

resourceName totalSlices

parse-where 使用不區分大小寫的 RegEx 旗標

在上述查詢中,預設模式會區分大小寫,因此已成功剖析字串。 未取得任何結果。

若要取得所需的結果,請以不區分大小寫的 (i) RegEx 旗標來執行 parse-where

只會成功剖析三個字串,因此結果會是三筆記錄 (某些 totalSlices 保留不正確整數)。

let Traces = datatable(EventText: string)
    [
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=non_valid_integer, sliceNumber=11, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=02/17/2016 08:40:00, previousLockTime=02/17/2016 08:39:00)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=non_valid_integer, sliceNumber=44, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces
| parse-where kind = regex flags=i EventText with * "RESOURCENAME=" resourceName "," * "totalSlices=" totalSlices: long "," *
| project resourceName, totalSlices

輸出

resourceName totalSlices
PipelineScheduler 27
PipelineScheduler 27
PipelineScheduler 27