Operador parse-kv

Extrae información estructurada de una expresión de cadena y representa la información en formato de clave-valor.

Se admiten los siguientes modos de extracción:

Syntax

Delimeter especificado

T|parse-kvExpresiónas(KeysList)with(pair_delimiter=PairDelimiter,kv_delimiter=KvDelimiter [,quote=QuoteChars ... [,escape=EscapeChar ...]] [,greedy=true] )

Delimitador no especificado

T|parse-kvExpresiónas(KeysList)with( [quote=QuoteChars ... [,escape=EscapeChar ...]] )

Regex

T|parse-kvExpresiónas(KeysList)with(regex=RegexPattern))

Obtenga más información sobre las convenciones de sintaxis.

Parámetros

Nombre Tipo Requerido Descripción
Expression string ✔️ Expresión de la que se van a extraer los valores de clave.
KeysList string ✔️ Lista separada por comas de nombres de clave y sus tipos de datos de valor. El orden de las claves no tiene que coincidir con el orden en que aparecen en el texto.
PairDelimiter string Delimitador que separa los pares clave-valor entre sí.
KvDelimiter string Delimitador que separa las claves de los valores.
QuoteChars string Literal de cadena de uno o dos caracteres que representa comillas de apertura y cierre con las que se puede encapsular el nombre de clave o el valor extraído. El parámetro se puede repetir para especificar un conjunto independiente de comillas de apertura y cierre.
EscapeChar string Literal de cadena de un carácter que describe un carácter que se puede usar para escapar caracteres especiales en un valor entre comillas. El parámetro se puede repetir si se usan varios caracteres de escape.
RegexPattern string Expresión regular que contiene dos grupos de captura exactamente. El primer grupo representa el nombre de clave y el segundo grupo representa el valor de clave.

Devoluciones

Expresión tabular de entrada original T, extendida con columnas por claves especificadas que se van a extraer.

Nota

  • Si una clave no aparece en un registro, el valor de columna correspondiente será null o una cadena vacía, dependiendo del tipo de columna.
  • Solo se extraen las claves que aparecen en el operador .
  • Se extrae la primera apariencia de una clave y se omiten los valores posteriores.
  • Al extraer claves y valores, se omiten los espacios en blanco iniciales y finales.

Ejemplos

Extracción con delimitadores bien definidos

En el ejemplo siguiente, las claves y los valores están separados por delimitadores bien definidos. Estos delimeters son caracteres de coma y dos puntos.

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

Salida

Texto ThreadId Máquina
El servicio está actualizado 458745723 Node001

Extracción con comillas de valor

A veces, los nombres de clave o los valores se encapsulan entre comillas, lo que permite que los propios valores contengan caracteres delimitadores. En los ejemplos siguientes se muestra cómo se usa un quote argumento para extraer dichos 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

Salida

la hora del evento src dst bytes failure
2021-01-01 10:00:54.0000000 10.1.1.123 10.1.1.124 125 conexión anulada

En el ejemplo siguiente se usan comillas de apertura y cierre 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

Salida

la hora del evento src dst bytes failure
2021-01-01 10:00:54.0000000 10.1.1.123 10.1.1.124 125 conexión anulada

Los propios valores pueden contener caracteres de comillas con escape correctos, como se muestra en el ejemplo siguiente:

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

Salida

time src dst bytes failure
2021-01-01 10:00:54.0000000 10.1.1.123 10.1.1.124 125 el host remoto enviado "bye!"

Extracción en modo expansivo

Hay casos en los que los valores sin comillas pueden contener delimitadores de par. En este caso, use el greedy modo para indicar al operador para examinar hasta la siguiente apariencia de clave (o final de cadena) al buscar el final del valor.

En los ejemplos siguientes se compara cómo funciona el operador con y sin el 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

Salida

name phone city
John 555 Nuevo
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

Salida

name phone city
John Doe 555 5555 Nueva York

Extracción sin delimitadores bien definidos

En el ejemplo siguiente, cualquier carácter nonalphanumeric se considera un 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

Salida

Texto ThreadId Máquina
Iniciado 458745723 Node001

Los valores entre comillas y escape se permiten en este modo, como se muestra en el ejemplo siguiente:

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

Salida

Texto ThreadId Máquina
El servicio ' está en marcha 458745723 Node001

Extracción mediante regex

Cuando ningún delimitador define la estructura de texto suficientemente bien, la extracción basada en expresiones regulares puede 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

Salida

dirección URL del referer url de solicitud id. de anunciante
https://hostname.com/redirect?dest=/?h=1234 https://hostname.com/?h=1234 24fefbca-cf27-4d62-a623-249c2ad30c73