Compartir vía


Operador parse-where

Evalúa una expresión de cadena y analiza su valor en una o varias columnas calculadas. El resultado es solo las cadenas analizadas correctamente.

parse-where analiza las cadenas de la misma manera que el análisis y filtra las cadenas que no se analizaron correctamente.

Consulte el operador parse, que genera valores NULL para cadenas analizadas sin errores.

Sintaxis

T | parse-where [kind=kind [flags= regexFlags]] expresión with * (stringConstant columnName [: columnType]) *...

Obtenga más información sobre las convenciones de sintaxis.

Parámetros

Nombre Type Obligatorio Descripción
T string ✔️ Entrada tabular que se va a analizar.
kind string ✔️ Uno de los valores de tipo admitidos. El valor predeterminado es simple.
regexFlags string Si kind es regex, puede especificar las marcas regex que se van a usar como U para ungreedy, m para el modo de varias líneas, s para buscar coincidencias con nuevas líneas \ny i para no distinguir mayúsculas de minúsculas. Puede encontrar más marcas en Marcas.
expression string ✔️ expresión que se evalúa como una cadena.
stringConstant string ✔️ Constante de cadena para la que buscar y analizar.
columnName string ✔️ nombre de una columna a la que se va a asignar un valor, extraído de la expresión de cadena.
columnType string El valor escalar que indica el tipo al que se convertirá el valor. string es el valor predeterminado.

Nota:

  • Use el proyecto si también desea quitar o cambiar el nombre de algunas columnas.
  • Use * en el patrón para omitir los valores no deseados. Este valor no se puede usar después string de la columna.
  • El patrón de análisis puede comenzar con ColumnName, además de StringConstant.
  • Si la expresión analizada no es de tipo string, se convertirá en el tipo string.

Valores de tipo admitidos

Texto Descripción
simple Este es el valor predeterminado. stringConstant es un valor de cadena normal y la coincidencia es estricta. Todos los delimitadores de cadena deben aparecer en la cadena analizada, y todas las columnas extendidas deben coincidir con los tipos necesarios.
regex stringConstant puede ser una expresión regular y la coincidencia es estricta. Todos los delimitadores de cadena, que pueden ser una expresión regular para este modo, deben aparecer en la cadena analizada, y todas las columnas extendidas deben coincidir con los tipos necesarios.

Modo Regex

En el modo regex, el análisis traducirá el patrón a una expresión regular y usará expresiones regulares para realizar la coincidencia mediante grupos capturados numerados que se controlan internamente. Por ejemplo:

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

La expresión regular que generará el análisis internamente es .*?<regex1>(.*?)<regex2>(\-\d+).

  • * se tradujo a .*?.
  • string se tradujo a .*?.
  • long se tradujo a \-\d+.

Devoluciones

Tabla de entrada, que se extiende según la lista de columnas que se proporcionan al operador.

Nota:

Solo las cadenas analizadas correctamente estarán en la salida. Las cadenas que no coinciden con el patrón se filtrarán.

Ejemplos

El operador parse-where proporciona una manera simplificada de aplicar extend a una tabla mediante el uso de varias aplicaciones extract en la misma expresión de string. Esto resulta más útil cuando la tabla tiene una string columna que contiene varios valores que desea dividir en columnas individuales. Por ejemplo, puede dividir una columna generada por una instrucción de seguimiento del desarrollador (""printf/"Console.WriteLine").

Usar parse

En el ejemplo siguiente, la columna EventText de la tabla Traces contiene cadenas del formulario Event: NotifySliceRelease (resourceName={0}, totalSlices= {1}, sliceNumber={2}, lockTime={3}, releaseTime={4}, previousLockTime={5}). La operación siguiente extenderá la tabla con seis columnas: resourceName , , lockTimetotalSlicessliceNumber, releaseTime, , previousLockTime, , Monthy Day.

Algunas de las cadenas no tienen una coincidencia completa.

Con parse, las columnas calculadas tendrán valores 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

Salida

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

Usar parse-where

El uso de "parse-where" filtrará las cadenas analizadas incorrectamente del resultado.

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

Salida

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

Modo Regex mediante marcas regex

Para obtener resourceName y totalSlices, use la siguiente consulta:

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

Salida

resourceName totalSlices

parse-where con la marca regex sin distinción entre mayúsculas y minúsculas

En la consulta anterior, el modo predeterminado distingue mayúsculas de minúsculas, por lo que las cadenas se analizaron correctamente. No se obtuvo ningún resultado.

Para obtener el resultado necesario, ejecute parse-where con una marca regex sin distinción entre mayúsculas y minúsculas (i).

Solo se analizarán correctamente tres cadenas, por lo que el resultado es tres registros (algunos totalSlices contienen enteros no válidos).

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

Salida

resourceName totalSlices
PipelineScheduler 27
PipelineScheduler 27
PipelineScheduler 27