Dela via


parse-where-operatorn

Utvärderar ett stränguttryck och parsar dess värde till en eller flera beräknade kolumner. Resultatet är bara de parsade strängarna.

parse-where parsar strängarna på samma sätt som parsa och filtrerar bort strängar som inte parsats korrekt.

Se parsningsoperatorn, som genererar null-värde för felaktigt parsade strängar.

Syntax

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

Läs mer om syntaxkonventioner.

Parametrar

Namn Typ Obligatorisk Beskrivning
T string ✔️ Tabellindata som ska parsas.
Typ string ✔️ Ett av de typvärden som stöds. Standardvärdet är simple.
regexFlags string Om typen är regexkan du ange regexflaggor som ska användas som U för odjur, m för flerradsläge, s för matchning av ny rad \noch i för skiftlägesokänsligt. Fler flaggor finns i Flaggor.
expression string ✔️ Ett uttryck som utvärderas till en sträng.
stringConstant string ✔️ En strängkonstant som du vill söka efter och parsa för.
columnName string ✔️ Namnet på en kolumn som du vill tilldela ett värde till, extraherat från stränguttrycket.
columnType string Det skalära värdet som anger vilken typ som värdet ska konverteras till. Standardvärdet är string.

Anteckning

  • Använd projektet om du också vill släppa eller byta namn på vissa kolumner.
  • Använd * i mönstret för att hoppa över skräpvärden. Det här värdet kan inte användas efter string kolumnen.
  • Parsningsmönstret kan börja med ColumnName, förutom StringConstant.
  • Om det parsade uttrycket inte är av typen stringkonverteras det till typen string.

Typvärden som stöds

Text Description
simple Detta är standardvärdet. stringConstant är ett vanligt strängvärde och matchningen är strikt. Alla strängavgränsare ska visas i den tolkade strängen och alla utökade kolumner måste matcha de typer som krävs.
regex stringConstant kan vara ett reguljärt uttryck och matchningen är strikt. Alla strängavgränsare, som kan vara en regex för det här läget, bör visas i den tolkade strängen och alla utökade kolumner måste matcha de typer som krävs.

Regex-läge

I regex-läge översätter parsningen mönstret till en regex och använder reguljära uttryck för att utföra matchningen med hjälp av numrerade insamlade grupper som hanteras internt. Exempel:

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

Regex som genereras av parsningen internt är .*?<regex1>(.*?)<regex2>(\-\d+).

  • * översattes till .*?.
  • string översattes till .*?.
  • long översattes till \-\d+.

Returer

Indatatabellen, som utökas enligt listan över kolumner som tillhandahålls till operatorn.

Anteckning

Endast parsade strängar kommer att finnas i utdata. Strängar som inte matchar mönstret filtreras bort.

Exempel

Operatorn parse-where ger en smidigare metod för extend en tabell med hjälp av flera extract program i samma string uttryck. Det här är mest användbart när tabellen har en string kolumn som innehåller flera värden som du vill dela upp i enskilda kolumner. Du kan till exempel dela upp en kolumn som har skapats av en utvecklarspårningssats ("printf/"Console.WriteLine").

Använda parse

I exemplet nedan innehåller kolumnen EventText i tabellen Traces strängar i formuläret Event: NotifySliceRelease (resourceName={0}, totalSlices= {1}, sliceNumber={2}, lockTime={3}, releaseTime={4}, previousLockTime={5}). Åtgärden nedan utökar tabellen med sex kolumner: resourceName , totalSlices, sliceNumber, lockTime, releaseTime, previousLockTime, Monthoch Day.

Några av strängarna har ingen fullständig matchning.

Med hjälp av parsehar de beräknade kolumnerna nullvärden.

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

Resultat

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

Använda parse-where

Om du använder "parsa-where" filtreras strängar som inte har parsats bort från resultatet.

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

Resultat

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-läge med regex-flaggor

Om du vill hämta resourceName och totalSlices använder du följande fråga:

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

Resultat

resourceName totalSlices

parse-where med skiftlägesokänslig regex-flagga

I ovanstående fråga var standardläget skiftlägeskänsligt, så strängarna parsades korrekt. Inget resultat erhölls.

För att få det nödvändiga resultatet kör du parse-where med en skiftlägesokänslig (i) regex-flagga.

Endast tre strängar parsas korrekt, så resultatet är tre poster (vissa totalSlices har ogiltiga heltal).

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

Resultat

resourceName totalSlices
PipelineScheduler 27
PipelineScheduler 27
PipelineScheduler 27