operador parse-where

Aplica-se a: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft 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 \ne 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ós string 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 tipo string.

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 DayMonth.

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