Partilhar via


operador parse-where

Avalia uma expressão de cadeia e analisa o respetivo valor numa ou mais colunas calculadas. O resultado são apenas as cadeias analisadas com êxito.

parse-where analisa as cadeias da mesma forma que a análise e filtra as cadeias que não foram analisadas com êxito.

Veja Operador de análise, que produz nulos para cadeias analisadas sem êxito.

Syntax

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

Saiba mais sobre as convenções de sintaxe.

Parâmetros

Nome Tipo Necessário Descrição
T string ✔️ A entrada tabular a analisar.
tipo string ✔️ Um dos valores de tipo suportados. O valor predefinido é simple.
regexFlags string Se kind for regex, pode especificar sinalizadores regex a serem utilizados como U para não gananciosos, m para o modo multilinha, s para corresponder à nova linha \ne para não sensível a maiúsculas e i minúsculas. Pode encontrar mais sinalizadores em Sinalizadores.
expression string ✔️ Uma expressão que é avaliada como uma cadeia.
stringConstant string ✔️ Uma constante de cadeia para a qual procurar e analisar.
columnName string ✔️ O nome de uma coluna à qual atribuir um valor, extraído da expressão de cadeia.
columnType string O valor escalar que indica o tipo para o qual converter o valor. A predefinição é .string

Nota

  • Utilize o projeto se também quiser remover ou mudar o nome de algumas colunas.
  • Utilize * no padrão para ignorar valores de lixo. Este valor não pode ser utilizado 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, será convertida para o tipo string.

Valores de tipo suportados

Texto Description
simple Este é o valor predefinido. stringConstant é um valor de cadeia regular e a correspondência é estrita. Todos os delimitadores de cadeia devem aparecer na cadeia analisada e todas as colunas expandidas têm de corresponder aos tipos necessários.
regex stringConstant pode ser uma expressão regular e a correspondência é estrita. Todos os delimitadores de cadeias, que podem ser um regex para este modo, devem aparecer na cadeia analisada e todas as colunas expandidas têm de corresponder aos tipos necessários.

Modo Regex

No modo regex, a análise traduzirá o padrão para um regex e utilizará expressões regulares para fazer a correspondência com grupos capturados numerados que são processados 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 para .*?.
  • string foi traduzido para .*?.
  • long foi traduzido para \-\d+.

Devoluções

A tabela de entrada, que é expandida de acordo com a lista de colunas fornecidas ao operador.

Nota

Apenas as cadeias analisadas com êxito estarão na saída. As cadeias que não corresponderem ao padrão serão filtradas.

Exemplos

O parse-where operador fornece uma forma simplificada de uma extend tabela ao utilizar várias extract aplicações na mesma string expressão. Isto é mais útil quando a tabela tem uma string coluna que contém vários valores que pretende dividir em colunas individuais. Por exemplo, pode dividir uma coluna produzida por uma instrução de rastreio do programador ("printf/"Console.WriteLine").

Ao utilizar parse

No exemplo abaixo, a coluna EventText da tabela Traces contém cadeias do formulário Event: NotifySliceRelease (resourceName={0}, totalSlices= {1}, sliceNumber={2}, lockTime={3}, releaseTime={4}, previousLockTime={5}). A operação abaixo irá expandir a tabela com seis colunas: resourceName , totalSlices, sliceNumber, lockTime, releaseTime, previousLockTime, Monthe Day.

Algumas das cadeias não têm uma correspondência completa.

Com 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 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

Ao utilizar parse-where

A utilização de "parse-where" filtrará as cadeias 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 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 com sinalizadores regex

Para obter o resourceName e totalSlices, utilize 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 sensível a maiúsculas e minúsculas

Na consulta acima, o modo predefinido era sensível às maiúsculas e minúsculas, pelo que as cadeias foram analisadas com êxito. Não foi obtido nenhum resultado.

Para obter o resultado necessário, execute parse-where com um sinalizador regex não sensível a maiúsculas e minúsculas (i).

Apenas três cadeias serão analisadas com êxito, pelo que o resultado é três registos (alguns totalSlices contêm números 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