Operatore parse-where

Valuta un'espressione stringa e ne analizza il valore in una o più colonne calcolate. Il risultato è solo le stringhe analizzate correttamente.

parse-where analizza le stringhe nello stesso modo dell'analisi e filtra le stringhe che non sono state analizzate correttamente.

Vedere l'operatore parse, che produce valori Null per le stringhe analizzate senza esito positivo.

Sintassi

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

Altre informazioni sulle convenzioni di sintassi.

Parametri

Nome Tipo Obbligatoria Descrizione
T string ✔️ Input tabulare da analizzare.
kind string ✔️ Uno dei valori di tipo supportati. Il valore predefinito è simple.
regexFlags string Se kind è regex, è possibile specificare flag regex da usare come U per la modalità a più righe, m per la modalità a più righe, s per la corrispondenza di nuova riga \ne senza distinzione tra maiuscole e i minuscole. Altri flag sono disponibili in Flag.
expression string ✔️ Espressione che restituisce una stringa.
stringConstant string ✔️ Costante stringa per cui eseguire la ricerca e l'analisi.
columnName string ✔️ Nome di una colonna a cui assegnare un valore, estratto dall'espressione stringa.
Columntype string Il valore calare che indica il tipo in cui convertire il valore. L'impostazione predefinita è string.

Nota

  • Usare il progetto anche se si desidera eliminare o rinominare alcune colonne.
  • Usare * nel modello per ignorare i valori indesiderati. Questo valore non può essere usato dopo string la colonna.
  • Il modello di analisi può iniziare con ColumnName, oltre a StringConstant.
  • Se l'espressione analizzata non è di tipo string, verrà convertita in tipo string.

Valori dei tipi supportati

Text Descrizione
simple Si tratta del valore predefinito. stringConstant è un valore stringa regolare e la corrispondenza è strict. Nella stringa analizzata dovranno comparire tutti i delimitatori di stringa e tutte le colonne estese devono corrispondere ai tipi richiesti.
regex stringConstant può essere un'espressione regolare e la corrispondenza è strict. Nella stringa analizzata dovranno comparire tutti i delimitatori di stringa, che possono essere regex per questa modalità, e tutte le colonne estese devono corrispondere ai tipi richiesti.

Modalità Regex

In modalità regex, l'analisi converte il criterio in un'espressione regolare e usa espressioni regolari per eseguire la corrispondenza usando gruppi acquisiti numerati gestiti internamente. Ad esempio:

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

L'espressione regolare che verrà generata dall'analisi internamente è .*?<regex1>(.*?)<regex2>(\-\d+).

  • * viene convertito in .*?.
  • string viene convertito in .*?.
  • long viene convertito in \-\d+.

Restituisce

Tabella di input, estesa in base all'elenco di colonne fornite all'operatore.

Nota

Solo le stringhe analizzate correttamente saranno nell'output. Le stringhe che non corrispondono al criterio verranno filtrate.

Esempi

L'operatore parse-where offre l'istruzione extend per semplificare l'estensione di una tabella usando più applicazioni extract nella stessa espressione string. Ciò è particolarmente utile quando la tabella contiene una string colonna contenente diversi valori che si desidera suddividere in singole colonne. Ad esempio, è possibile suddividere una colonna prodotta da un'istruzione di traccia per sviluppatori ("printf"/"Console.WriteLine").

Uso di parse

Nell'esempio seguente la colonna EventText della tabella Traces contiene stringhe del formato Event: NotifySliceRelease (resourceName={0}, totalSlices= {1}, sliceNumber={2}, lockTime={3}, releaseTime={4}, previousLockTime={5}). L'operazione seguente estenderà la tabella con sei colonne: resourceName , , sliceNumbertotalSlices, lockTime, previousLockTimereleaseTime, Month, e Day.

Alcune stringhe non hanno una corrispondenza completa.

Usando parse, le colonne calcolate avranno valori 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

Output

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

Uso di parse-where

L'uso di 'parse-where' filtra le stringhe analizzate senza esito positivo dal risultato.

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

Output

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

Modalità Regex con flag regex

Per ottenere resourceName e totalSlices, usare la query seguente:

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

Output

resourceName totalSlices

parse-where con flag regex senza distinzione tra maiuscole e minuscole

Nella query precedente la modalità predefinita è stata distinzione tra maiuscole e minuscole, quindi le stringhe sono state analizzate correttamente. Non è stato ottenuto alcun risultato.

Per ottenere il risultato richiesto, eseguire parse-where con un flag regex senza distinzione tra maiuscole e minuscole (i).

Verranno analizzate correttamente solo tre stringhe, quindi il risultato è tre record (alcuni totali contengono interi non validi).

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

Output

resourceName totalSlices
PipelineScheduler 27
PipelineScheduler 27
PipelineScheduler 27