parse-where 演算子

文字列式が評価され、その値が1つまたは複数の計算列に解析されます。 結果は、正常に解析された文字列のみになります。

parse-where は、parse と同じ方法で文字列を解析し、正常に解析されなかった文字列を除外します。

解析できなかった文字列に対してnullを生成するparse 演算子を参照してください。

構文

T| parse-where [kind=kind [flags=regexFlags]] expressionwith* (stringConstantcolumnName [:columnType]) *...

構文規則について詳しく知る。

パラメーター

名前 必須 説明
T string ✔️ 解析する表形式の入力。
kind string ✔️ サポートされている種類の値の 1 つ。 既定値は simple です。
regexFlags string kind が の場合はregex、ungreedy、複数行モード、一致する改行\nmsおよび大文字とi小文字を区別しない場合のようにU使用する正規表現フラグを指定できます。 その他のフラグについては、「 フラグ」を参照してください。
式 (expression) string ✔️ 文字列に評価される式。
stringConstant string ✔️ 検索および解析する文字列定数。
columnName string ✔️ 文字列式から抽出された値を割り当てる列の名前。
columnType string 値の変換後の型を示すスカラー値。 既定値は string です。

注意

  • いくつかの列を削除したり名前を変更したりする場合も project を使用します。
  • パターンで を使用して * 、迷惑メール値をスキップします。 この値は列の後には string 使用できません。
  • 解析パターンは、StringConstantに加えて、ColumnNameで始まる場合があります。
  • 解析された が 型でない場合は、 型 stringstring変換されます。

サポートされている種類の値

Text 説明
simple これが既定値です。 stringConstant は通常の文字列値であり、一致は厳密です。 すべての文字列の区切り記号が解析される文字列に含まれ、すべての拡張列が必要な型と一致している必要があります。
regex stringConstant は正規表現であり、一致は厳密です。 すべての文字列の区切り記号 (このモードでは正規表現が可能です) が解析される文字列に含まれ、すべての拡張列が必要な型と一致している必要があります。

正規表現モード

正規表現モードでは、parse はパターンを正規表現に変換し 、正規表現を 使用して、内部的に処理される番号付きキャプチャ グループを使用して照合を行います。 例:

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

解析によって内部的に生成される正規表現は.*?<regex1>(.*?)<regex2>(\-\d+)です。

  • *.*? に変換されました。
  • string.*? に変換されました。
  • long\-\d+ に変換されました。

戻り値

演算子に与えられた列の一覧に従って拡張された入力テーブル。

Note

出力には、正常に解析された文字列のみが含まれます。 パターンに一致しない文字列は除外されます。

parse-where 演算子を使用すると、同じ string 式で複数の extract アプリケーションを使用して、テーブルを簡単に extend できます。 これは、個別の列に分割する複数の値を含むstring列がテーブルに含まれている場合に最も便利です。 たとえば、開発者トレース ("printf"/"Console.WriteLine") ステートメントによって生成された列を分割することができます。

parse を使用する

次の例では、テーブルTracesの列EventTextEvent: NotifySliceRelease (resourceName={0}, totalSlices= {1}, sliceNumber={2}, lockTime={3}, releaseTime={4}, previousLockTime={5})形式の文字列が含まれているとします。 resourceNametotalSlicessliceNumberlockTimereleaseTimepreviousLockTimeMonthDayの6つの列を含むこのテーブルが、下記の操作によって拡張されます。

一部の文字列には完全一致がありません。

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

正規表現フラグを使用する正規表現モード

次のクエリを使用して、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大文字と小文字を区別しない正規表現フラグ

上記のクエリでは、既定のモードでは大文字と小文字が区別されていたため、文字列は正常に解析されました。 結果は取得されませんでした。

必要な結果を得るには、parse-where大文字と小文字を区別しない(i)正規表現フラグを指定して実行します。

3つの文字列のみが正常に解析されるため、結果は3つのレコードになります(一部の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