Operador parse-where
Se aplica a: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
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 \n y 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ésstring
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 tipostring
.
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
, , lockTime
totalSlices
sliceNumber
, releaseTime
, , previousLockTime
, , Month
y 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 |