operador parse-where
Aplica-se a: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Avalia uma expressão de cadeia de caracteres e analisa seu valor em uma ou mais colunas calculadas. O resultado são apenas as cadeias de caracteres analisadas com êxito.
parse-where
analisa as strings da mesma forma que a análise e filtra as strings que não foram analisadas com êxito.
Consulte o operador de análise, que produz nulos para cadeias de caracteres analisadas sem êxito.
Sintaxe
Expressão with
*
T | parse-where
[kind=
kind [ flags=
regexFlags]] (stringConstant columnName [ :
columnType]) ... *
Saiba mais sobre as convenções de sintaxe.
Parâmetros
Nome | Digitar | Obrigatória | Descrição |
---|---|---|---|
T | string |
✔️ | A entrada tabular a ser analisada. |
kind | string |
✔️ | Um dos valores de tipo com suporte. O valor padrão é simple . |
regexFlags | string |
Se kind for regex , então você pode especificar sinalizadores regex a serem usados como U para ungreedy, m para o modo multi-linha, s para match new line \n e i para não diferenciar maiúsculas de minúsculas. Mais sinalizadores podem ser encontrados em Sinalizadores. |
|
expressão | string |
✔️ | uma expressão avaliada como uma cadeia de caracteres. |
stringConstante | string |
✔️ | Uma constante de cadeia de caracteres para pesquisar e analisar. |
columnName | string |
✔️ | O nome de uma coluna à qual atribuir um valor, extraído da expressão de cadeia de caracteres. |
columnType | string |
O valor escalar que indica o tipo no qual converter o valor. O padrão é o string . |
Observação
- Use project se você também quiser descartar ou renomear algumas colunas.
- Use
*
no padrão para ignorar valores inúteis. Esse valor não pode ser usado apósstring
a coluna. - O padrão de análise pode começar com ColumnName, além de StringConstant.
- Se a expressão analisada não for do tipo
string
, ela será convertida no tipostring
.
Valores de tipo com suporte
Texto | Descrição |
---|---|
simple |
Este é o valor padrão. stringConstant é um valor de string regular e a correspondência é estrita. Todos os delimitadores de cadeia de caracteres devem aparecer na cadeia de caracteres analisada e todas as colunas estendidas devem corresponder aos tipos necessários. |
regex |
stringConstant pode ser uma expressão regular e a correspondência é estrita. Todos os delimitadores de cadeia de caracteres, que podem ser um regex para esse modo, devem aparecer na cadeia de caracteres analisada e todas as colunas estendidas devem corresponder aos tipos necessários. |
Modo Regex
No modo regex, a análise traduzirá o padrão em um regex e usará expressões regulares para fazer a correspondência usando grupos capturados numerados que são tratados internamente. Por exemplo:
parse-where kind=regex Col with * <regex1> var1:string <regex2> var2:long
O regex que será gerado pela análise internamente é .*?<regex1>(.*?)<regex2>(\-\d+)
.
*
foi traduzido em.*?
.string
foi traduzido em.*?
.long
foi traduzido em\-\d+
.
Devoluções
A tabela de entrada, que é estendida de acordo com a lista de colunas fornecidas ao operador.
Observação
Somente cadeias de caracteres analisadas com êxito estarão na saída. As cadeias de caracteres que não corresponderem ao padrão serão filtradas.
Exemplos
O operador parse-where
fornece uma forma simplificada de extend
uma tabela usando vários aplicativos extract
na mesma expressão string
. Isso é mais útil quando a tabela tem uma string
coluna que contém vários valores que você deseja dividir em colunas individuais. Por exemplo, você pode dividir uma coluna que foi produzida por uma instrução de rastreamento de desenvolvedor ("printf
"/"Console.WriteLine
").
Usando parse
No exemplo abaixo, a coluna EventText
da tabela Traces
contém cadeias de caracteres do formato Event: NotifySliceRelease (resourceName={0}, totalSlices= {1}, sliceNumber={2}, lockTime={3}, releaseTime={4}, previousLockTime={5})
. A operação abaixo estenderá a tabela com seis colunas: resourceName
, totalSlices
, sliceNumber
, lockTime
, releaseTime
, previousLockTime
, , e Day
Month
.
Algumas das cordas não têm uma correspondência completa.
Usando parse
, as colunas calculadas terão nulos.
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
Saída
resourceName | totalSlices | sliceNumber | lockTime | releaseTime | previousLockTime |
---|---|---|---|---|---|
PipelineScheduler | 27 | 20 | 17/02/2016 08:40:01 | 2016-02-17 08:40:01.0000000 | 2016-02-17 08:39:01.0000000 |
PipelineScheduler | 27 | 22 | 17/02/2016 08:41:01 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:40:01.0000000 |
Usando parse-where
Usar 'parse-where' filtrará as strings analisadas sem êxito do 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
Saída
resourceName | totalSlices | sliceNumber | lockTime | releaseTime | previousLockTime |
---|---|---|---|---|---|
PipelineScheduler | 27 | 20 | 17/02/2016 08:40:01 | 2016-02-17 08:40:01.0000000 | 2016-02-17 08:39:01.0000000 |
PipelineScheduler | 27 | 22 | 17/02/2016 08:41:01 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:40:01.0000000 |
Modo Regex usando sinalizadores regex
Para obter resourceName e totalSlices, use a seguinte 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
Saída
resourceName | totalSlices |
---|---|
parse-where
com sinalizador regex que não diferencia maiúsculas de minúsculas
Na consulta acima, o modo padrão diferenciava maiúsculas de minúsculas, portanto, as cadeias de caracteres foram analisadas com êxito. Nenhum resultado foi obtido.
Para obter o resultado necessário, execute parse-where
com um sinalizador regex que não diferencia maiúsculas de minúsculas (i
).
Apenas três cadeias de caracteres serão analisadas com êxito, portanto, o resultado são três registros (alguns totalSlices contêm inteiros invá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
Saída
resourceName | totalSlices |
---|---|
PipelineScheduler | 27 |
PipelineScheduler | 27 |
PipelineScheduler | 27 |