operador parse-kv

Extrai informações estruturadas de uma expressão de cadeia e representa as informações num formulário chave/valor.

Os seguintes modos de extração são suportados:

Syntax

Delimetrador especificado

T|parse-kvExpressãoas(Lista de Chaves)with(pair_delimiter=ParDelimiter,kv_delimiter=KvDelimiter [,quote=QuoteChars ... [,escape=EscapeChar ...]] [,greedy=true] )

Delimitador não específico

T|parse-kvExpressãoas(Lista de Chaves)with( [quote=QuoteChars ... [,escape=EscapeChar ...]] )

Regex

T|parse-kvExpressãoas(Lista de Chaves)with(regex=RegexPattern))

Saiba mais sobre as convenções de sintaxe.

Parâmetros

Nome Tipo Necessário Descrição
Expression string ✔️ A expressão a partir da qual extrair valores-chave.
Lista de Chaves string ✔️ Uma lista separada por vírgulas de nomes de chaves e os respetivos tipos de dados de valor. A ordem das teclas não tem de corresponder à ordem pela qual aparecem no texto.
ParDelimiter string Um delimitador que separa pares de valores chave uns dos outros.
KvDelimiter string Um delimitador que separa as chaves dos valores.
QuoteChars string Um literal de cadeia de carateres de um ou dois carateres que representa aspas de abertura e fecho com as quais o nome da chave ou o valor extraído pode ser moldado. O parâmetro pode ser repetido para especificar um conjunto separado de aspas de abertura/fecho.
EscapeChar string Um literal de cadeia de carateres de um caráter que descreve um caráter que pode ser utilizado para escapar a carateres especiais num valor citado. O parâmetro pode ser repetido se forem utilizados vários carateres de escape.
RegexPattern string Uma expressão regular que contém dois grupos de captura exatamente. O primeiro grupo representa o nome da chave e o segundo grupo representa o valor da chave.

Devoluções

A expressão tabular de entrada original T, expandida com colunas por chaves especificadas para extrair.

Nota

  • Se uma chave não aparecer num registo, o valor da coluna correspondente será null ou uma cadeia vazia, dependendo do tipo de coluna.
  • São extraídas apenas as chaves listadas no operador.
  • O primeiro aspeto de uma chave é extraído e os valores subsequentes são ignorados.
  • Ao extrair chaves e valores, os espaços brancos à esquerda e à direita são ignorados.

Exemplos

Extração com delimitadores bem definidos

No exemplo seguinte, as chaves e os valores são separados por delimitadores bem definidos. Estes delimetres são carateres de vírgulas e dois pontos.

print str="ThreadId:458745723, Machine:Node001, Text: The service is up, Level: Info"
| parse-kv str as (Text: string, ThreadId:long, Machine: string) with (pair_delimiter=',', kv_delimiter=':')
| project-away str

Saída

Texto ThreadId Máquina
O serviço está em funcionamento 458745723 Nó001

Extração com a citação de valores

Por vezes, os nomes ou valores de chave são moldados em aspas, o que permite que os próprios valores contenham carateres delimitadores. Os exemplos seguintes mostram como um quote argumento é utilizado para extrair esses valores.

print str='src=10.1.1.123 dst=10.1.1.124 bytes=125 failure="connection aborted" "event time"=2021-01-01T10:00:54'
| parse-kv str as (['event time']:datetime, src:string, dst:string, bytes:long, failure:string) with (pair_delimiter=' ', kv_delimiter='=', quote='"')
| project-away str

Saída

hora do evento src dst bytes falha
2021-01-01 10:00:54.0000000 10.1.1.123 10.1.1.124 125 ligação abortada

O exemplo seguinte utiliza aspas de abertura e fecho diferentes:

print str='src=10.1.1.123 dst=10.1.1.124 bytes=125 failure=(connection aborted) (event time)=(2021-01-01 10:00:54)'
| parse-kv str as (['event time']:datetime, src:string, dst:string, bytes:long, failure:string) with (pair_delimiter=' ', kv_delimiter='=', quote='()')
| project-away str

Saída

hora do evento src dst bytes falha
2021-01-01 10:00:54.0000000 10.1.1.123 10.1.1.124 125 ligação abortada

Os próprios valores podem conter carateres de aspas corretamente escapados, como mostra o exemplo seguinte:

print str='src=10.1.1.123 dst=10.1.1.124 bytes=125 failure="the remote host sent \\"bye!\\"" time=2021-01-01T10:00:54'
| parse-kv str as (['time']:datetime, src:string, dst:string, bytes:long, failure:string) with (pair_delimiter=' ', kv_delimiter='=', quote='"', escape='\\')
| project-away str

Saída

hora src dst bytes falha
2021-01-01 10:00:54.0000000 10.1.1.123 10.1.1.124 125 o anfitrião remoto enviou "adeus!"

Extração no modo ganancioso

Existem casos em que os valores não listados podem conter delimitadores de pares. Neste caso, utilize o greedy modo para indicar ao operador para analisar até ao aspeto da chave seguinte (ou fim da cadeia) ao procurar o valor que termina.

Os exemplos seguintes comparam a forma como o operador funciona com e sem o greedy modo especificado:

print str='name=John Doe phone=555 5555 city=New York'
| parse-kv str as (name:string, phone:string, city:string) with (pair_delimiter=' ', kv_delimiter='=')
| project-away str

Saída

name telefone city
John 555 Novo
print str='name=John Doe phone=555 5555 city=New York'
| parse-kv str as (name:string, phone:string, city:string) with (pair_delimiter=' ', kv_delimiter='=', greedy=true)
| project-away str

Saída

name telefone city
João Silva 555 5555 Nova Iorque

Extração sem delimitadores bem definidos

No exemplo seguinte, qualquer caráter não fantasmagómico é considerado um delimitador válido:

print str="2021-01-01T10:00:34 [INFO] ThreadId:458745723, Machine:Node001, Text: Started"
| parse-kv str as (Text: string, ThreadId:long, Machine: string)
| project-away str

Saída

Texto ThreadId Máquina
Iniciado 458745723 Nó001

Os valores que citam e escapam são permitidos neste modo, conforme mostrado no exemplo seguinte:

print str="2021-01-01T10:00:34 [INFO] ThreadId:458745723, Machine:Node001, Text: 'The service \\' is up'"
| parse-kv str as (Text: string, ThreadId:long, Machine: string) with (quote="'", escape='\\')
| project-away str

Saída

Texto ThreadId Máquina
O serviço " está em funcionamento 458745723 Nó001

Extração com regex

Quando nenhum delimitador define uma estrutura de texto suficientemente bem, a extração regular baseada em expressões pode ser útil.

print str=@'["referer url: https://hostname.com/redirect?dest=/?h=1234", "request url: https://hostname.com/?h=1234", "advertiser id: 24fefbca-cf27-4d62-a623-249c2ad30c73"]'
| parse-kv str as (['referer url']:string, ['request url']:string, ['advertiser id']: guid) with (regex=@'"([\w ]+)\s*:\s*([^"]*)"')
| project-away str

Saída

url do referer url do pedido ID do anunciante
https://hostname.com/redirect?dest=/?h=1234 https://hostname.com/?h=1234 24fefbca-cf27-4d62-a623-249c2ad30c73