Opérateur parse-where

Évalue une expression de chaîne et analyse sa valeur dans une ou plusieurs colonnes calculées. Le résultat est uniquement les chaînes analysées avec succès.

parse-where analyse les chaînes de la même manière que l’analyse et filtre les chaînes qui n’ont pas été analysées correctement.

Consultez l’opérateur d’analyse, qui produit des valeurs Null pour les chaînes analysées sans succès.

Syntax

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

Découvrez les conventions de syntaxe.

Paramètres

Nom Type Obligatoire Description
T string ✔️ Entrée tabulaire à analyser.
kind string ✔️ Une des valeurs de type prises en charge. La valeur par défaut est simple.
regexFlags string Si le type a la valeur regex, vous pouvez spécifier des indicateurs regex à utiliser comme U pour le non-classement, m pour le mode multiligne, s pour la correspondance de la nouvelle ligne \net i pour les indicateurs de respect de la casse. Vous trouverez d’autres indicateurs dans Indicateurs.
expression string ✔️ Expression qui prend la valeur d’une chaîne.
stringConstant string ✔️ Constante de chaîne pour laquelle rechercher et analyser.
columnName string ✔️ Nom d’une colonne à laquelle attribuer une valeur, extrait de l’expression de chaîne.
columnType string Valeur scalaire indiquant le type vers lequel convertir la valeur. La valeur par défaut est string.

Notes

  • Utilisez project si vous souhaitez également supprimer ou renommer certaines colonnes.
  • Utilisez * dans le modèle pour ignorer les valeurs indésirables. Cette valeur ne peut pas être utilisée après string la colonne.
  • Le modèle d’analyse peut commencer par ColumnName, en plus de StringConstant.
  • Si l’expression analysée n’est pas de type string, elle sera convertie en type string.

Valeurs de type prises en charge

Texte Description
simple Il s’agit de la valeur par défaut. stringConstant est une valeur de chaîne régulière et la correspondance est stricte. Tous les délimiteurs de chaîne doivent apparaître dans la chaîne analysée, et toutes les colonnes étendues doivent correspondre aux types requis.
regex stringConstant peut être une expression régulière et la correspondance est stricte. Tous les délimiteurs de chaîne, qui peuvent être une expression régulière pour ce mode, doivent apparaître dans la chaîne analysée, et toutes les colonnes étendues doivent correspondre aux types requis.

Mode Regex

En mode regex, l’analyse traduit le modèle en regex et utilise des expressions régulières afin d’effectuer la correspondance à l’aide de groupes capturés numérotés qui sont gérés en interne. Par exemple :

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

Le regex qui sera généré en interne par l’analyse est .*?<regex1>(.*?)<regex2>(\-\d+).

  • * a été traduit en .*?.
  • string a été traduit en .*?.
  • long a été traduit en \-\d+.

Retours

La table d’entrée, qui est étendue en fonction de la liste des colonnes fournies à l’opérateur.

Notes

Seules les chaînes analysées avec succès se trouveront dans la sortie. Les chaînes qui ne correspondent pas au modèle seront filtrées.

Exemples

L’opérateur parse-where offre un moyen simplifié d’étendre (extend) une table à l’aide de plusieurs applications extract sur la même expression string. Cela est particulièrement utile lorsque la table a une string colonne qui contient plusieurs valeurs que vous souhaitez diviser en colonnes individuelles. Par exemple, vous pouvez diviser une colonne qui a été produite par une instruction de trace de développeur ( »printf « /"Console.WriteLine »).

Utilisation de parse

Dans l’exemple ci-dessous, la colonne EventText de la table Traces contient des chaînes de la forme Event: NotifySliceRelease (resourceName={0}, totalSlices= {1}, sliceNumber={2}, lockTime={3}, releaseTime={4}, previousLockTime={5}). L’opération ci-dessous étend la table avec six colonnes : resourceName , totalSlices, sliceNumber, lockTime, releaseTimepreviousLockTime, , Month, et Day.

Certaines chaînes n’ont pas de correspondance complète.

À l’aide parsede , les colonnes calculées auront des valeurs 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

Sortie

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

Utilisation de parse-where

L’utilisation de « parse-where » permet de filtrer les chaînes analysées sans succès du résultat.

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

Sortie

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

Mode Regex à l’aide d’indicateurs regex

Pour obtenir les resourceName et totalSlices, utilisez la requête suivante :

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

Sortie

resourceName totalSlices

parse-where avec l’indicateur regex insensible à la casse

Dans la requête ci-dessus, le mode par défaut respectant la casse, les chaînes ont donc été analysées correctement. Aucun résultat n’a été obtenu.

Pour obtenir le résultat requis, exécutez parse-where avec un indicateur regex qui ne respecte pas la casse (i).

Seules trois chaînes seront analysées correctement, de sorte que le résultat est de trois enregistrements (certains totalSlices contiennent des entiers non valides).

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

Sortie

resourceName totalSlices
PipelineScheduler 27
PipelineScheduler 27
PipelineScheduler 27