Extracción de texto entre dos delimitadores: múltiples delimitadores en una cadena

Un usuario Pregunto ✅

joooficina

Tengo una serie de etiquetas en mi base de datos que cuando exporto a Excel aparecen en una columna, divididas por comas.

Quiero extraer cualquier etiqueta que contenga «WBS», pero quiero la etiqueta completa, es decir, entre las dos comas.

Estoy seguro de que es una combinación de text.contains y text between delimitadores, pero «WBS» podría aparecer en cualquier lugar de la lista, o no aparecer en absoluto.

Los datos existentes Resultado Esperado
BOD – 2 adultos,Mercaz – 2 adultos,Trad B,WBS Tasas de entierro – 2 adultos,Aprendizaje de adultos,Correos,Atención comunitaria,Acción social,Cultura Tarifas de entierro de WBS – 2 adultos
Sin correo, Curación
Tarifas de entierro de WBS – 1 adulto, BOD – 1 adulto, Mercaz – 1 adulto, Trad A Tarifas de entierro de WBS – 1 adulto

Rocco_sprmnt21

En respuesta a Rocco_sprmnt21

borrando el último paso

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("dY/BCsIwEER/Zcl5PegfNBHxYO2hgoeQw9IuEmgTSJqDfr1JS6VQPA07zJtltBayOcMBTkB9GqaINYeOPlvnEagHiU/ZgkzB0gAX5rhNVEXgxhScdS+syQ5ZIyo/jsnZ6Q2KAmPru0JX3WS9Q5WZFFig+N8sDGpx9zDmRrwyldoMwOzvseOC4TJpvX6LVmMeVO0eC2O+", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [#"Existing Data" = _t, #"Expected Result" = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Existing Data", type text}, {"Expected Result", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "extract WBS", each try List.Select( Text.Split([Existing Data],","), each Text.Contains(_,"WBS")){0} otherwise "")
 
in
    #"Added Custom"

que ya no es necesario y cambiando el paso anterior

Rocco_sprmnt21

esto debería funcionar incluso si hay muchas subcadenas que contienen la clave:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("dY/BCsIwEER/Zcl5PegfNBHxYO2hgoeQw9IuEmgTSJqDfr1JS6VQPA07zJtltBayOcMBTkB9GqaINYeOPlvnEagHiU/ZgkzB0gAX5rhNVEXgxhScdS+syQ5ZIyo/jsnZ6Q2KAmPru0JX3WS9Q5WZFFig+N8sDGpx9zDmRrwyldoMwOzvseOC4TJpvX6LVmMeVO0eC2O+", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [#"Existing Data" = _t, #"Expected Result" = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Existing Data", type text}, {"Expected Result", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "extract WBS", each List.Select( Text.Split([Existing Data],","), each Text.Contains(_,"WBS"))),
    #"Extracted Values" = Table.TransformColumns(#"Added Custom", {"extract WBS", each Text.Combine(List.Transform(_, Text.From), ","), type text})
in
    #"Extracted Values"

si está seguro de que en cada fila solo hay una subcadena que contiene «WBS», puede simplificar un poco el código.

Rocco_sprmnt21

En respuesta a Rocco_sprmnt21

borrando el último paso

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("dY/BCsIwEER/Zcl5PegfNBHxYO2hgoeQw9IuEmgTSJqDfr1JS6VQPA07zJtltBayOcMBTkB9GqaINYeOPlvnEagHiU/ZgkzB0gAX5rhNVEXgxhScdS+syQ5ZIyo/jsnZ6Q2KAmPru0JX3WS9Q5WZFFig+N8sDGpx9zDmRrwyldoMwOzvseOC4TJpvX6LVmMeVO0eC2O+", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [#"Existing Data" = _t, #"Expected Result" = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Existing Data", type text}, {"Expected Result", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "extract WBS", each try List.Select( Text.Split([Existing Data],","), each Text.Contains(_,"WBS")){0} otherwise "")
 
in
    #"Added Custom"

que ya no es necesario y cambiando el paso anterior

Rocco_sprmnt21

En respuesta a Rocco_sprmnt21

otra forma, un poco retorcida, que hace uso de la función text. between…:

Table.AddColumn(#»Tipo cambiado», «extraer WBS», cada sufijo let= Text.BetweenDelimiters([Existing Data],»WBS»,»,») en Text.Repeat(«WBS»,Number.From(Text.Length(suffix)>0))&suffix)

Rocco_sprmnt21

En respuesta a Rocco_sprmnt21

usando otra función de texto:

Table.AddColumn(#»Tipo cambiado», «extraer WBS», cada uno después de WBS=Text.RemoveRange(_[Existing Data], 0,Texto.PosiciónDe(_[Existing Data],»WBS»)) en Try Text.Range(afterWBS,0, Text.PositionOf(afterWBS,»,»))de lo contrario «»)

Rocco_sprmnt21

En respuesta a Rocco_sprmnt21

Agrego otra variante de la última solución:

Table.AddColumn(#»Tipo cambiado», «extraer WBS», cada uno después de WBS=Text.RemoveRange(_[Existing Data], 0,Texto.PosiciónDe(_[Existing Data],»WBS»)) en Try Text.BeforeDelimiter(afterWBS,»,»)de lo contrario «»)

PD

Aprovecho para resaltar que estas últimas soluciones se basan en que la clave WBS está justo al principio del TAG (es decir, justo después de la coma o al principio del texto).
Solo las soluciones anteriores con text.split y text.contains son más válidas en general.

joooficina

En respuesta a Rocco_sprmnt21

Gracias, solo habrá una subcadena que contenga WBS en cualquier celda. ¿Cómo simplificaría el código?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *