Compartir a través de


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:

  • Delimeter especificado: extracción basada en delimitadores especificados que dictan cómo las claves y los pares se separan entre sí.
  • Delimeter no especificado: extracción sin necesidad de especificar delimitadores. Cualquier carácter nonalphanumeric se considera un delimitador.
  • Regex: extracción basada en expresiones regulares.

Sintaxis

Delimeter especificado

Claves de expresión ( as TList with pair_delimiter parse-kv ( | ) = PairDelimiter = , kv_delimiter KvDelimiter [ quote =, QuoteChars ... [, escape = EscapeChar ...]] [, greedy = true])

Delimitador no especificado

T parse-kv | Expression as ( KeysList ) ( with [quote = QuoteChars ... [, escape = EscapeChar ...]])

Regex

Claves de expresión as ( TList | parse-kv ) regex ( = with RegexPattern) )

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

Parámetros

Nombre Type Obligatorio 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 pares de valor de clave 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 incluir 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, según el 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 comas y caracteres de 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 Machine
El servicio está en marcha 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 estos 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 correctamente, 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 pares. En este caso, use el greedy modo para indicar al operador que va a examinar hasta la siguiente apariencia de clave (o final de cadena) al buscar el valor final.

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

nombre teléfono 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

nombre teléfono 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 Machine
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 Machine
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