cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
Helper IV
Helper IV

Cómo extraer un conjunto de cadenas continua de una columna con varios criterios

Hola

Tengo una Columna A con nombres de cliente.
Tabla 1 Tabla 2
Cliente Nombre Proyectos en curso
Microsoft Corporation Ltd Microsoft
BARCALAYS (LLP) Barcalays
Caseys General Casey's
LLP Ernst and Young Ernst and Young
ASTRAZENCALimited Astrazanca

Quiero buscar y extraer los nombres de los clientes de la Tabla 1 como se indica a continuación:
Columna de resultados
Microsoft
Barcalays
Casey
Ernst and Young
Astrazenca

Básicamente la lógica que estoy buscando es la siguiente. La función/fórmula debe comprobar la secuencia continua de caracteres de la Tabla B en la Tabla A y devolver toda esa secuencia. También esta búsqueda debe ser insensible a mayúsculas y minúsculas (Por ejemplo: BARCALAYS y Barcalays) y también el texto de búsqueda puede estar entre la columna de texto interior en cualquier lugar y no necesariamente al principio (Por ejemplo: LLP Ernst y Youngand Ernst and Young).
Un criterio importante es que debe devolver coincidencias para la cadena continua mayor que 2 (es decir, 3 y superior).

He probado varias fórmulas como Buscar, Buscar, Minx, Izquierda, pero no estoy obteniendo el resultado deseado con el conjunto anterior de criterios cumplidos. Por favor, ayúdame con la fórmula lógica para esto.

Feliz de dar cualquier información adicional relacionada con esto.

1 ACCEPTED SOLUTION

@deepakramamurth - OK, actualicé esto con una versión de salida de nombre de cliente y la versión de salida del proyecto en 2 columnas adicionales. Revisé los fósforos, no veo nada obviamente mal. ¿Resuelto?

PBIX está conectado.


---------------------------------------

@ me in replies or I'll lose your thread!!!

I have a NEW book! 
DAX Cookbook from Packt
Over 120 DAX Recipes!




Did I answer your question? Mark my post as a solution!

Proud to be a Super User!




View solution in original post

53 REPLIES 53
Super User IV
Super User IV

@deepakramamurth - Todo tipo de confundidos en este. Puede hacer referencia a la Tabla 1, Tabla 2, Tabla A, Tabla B. ¿Se supone que hace coincidencias difusas con Caseys a juego de Casey? ¿Dónde está creando esta nueva columna? ¿Es una columna nueva? ¿Es una mesa? Para búsquedas que no distinguen mayúsculas de minúsculas, utilice BUSCAR. Probablemente pueda llegar allí usando Text to Table, pero necesitaría alguna aclaración de usted para ser más específico que eso.

https://community.powerbi.com/t5/Quick-Measures-Gallery/Text-to-Table/m-p/1312929#M594

Podría ser una solución usando sólo SEARCH también donde se obtienen todas las filas de la Tabla 2 (Tabla B??) y ADDCOLUMNS con una BUSCAR como esta:

Column in Table 1 (Table A?) =
  VAR __ClientName = [Client Name]
  VAR __Table =
    ADDCOLUMNS(
      ADDCOLUMNS(
        'Table 2/B?',
        "Search",SEARCH([Ongoing Projects],__ClientName,,0)
      ),
      "Result",IF([Search]>0,MID(__ClientName,[Search],LEN([Ongoing Projects])),BLANK())
    )
RETURN
  MAXX(__Table,[Result])


---------------------------------------

@ me in replies or I'll lose your thread!!!

I have a NEW book! 
DAX Cookbook from Packt
Over 120 DAX Recipes!




Did I answer your question? Mark my post as a solution!

Proud to be a Super User!




@Greg_Deckler Gracias por su respuesta. Digamos que las tablas 1 y 2 son las Tablas A y B respectivamente. No necesito hacer una búsqueda difusa. El shourd de Casey devuelve solo Casey ya que los primeros 5 caracteres coinciden con el texto de búsqueda.

Necesito crear una nueva columna (Resultado) y no una tabla que recupere el valor buscado. Supongamos que esta nueva columna se creará en la tabla A junto a la columna 'Nombre del cliente'. Por lo tanto, recoge los términos de búsqueda de la tabla B, busca una coincidencia de cadena continua con la columna 'Nombre del cliente' y rellena la columna 'Resultado'.

No es una búsqueda difusa, sino una búsqueda de cadena continua (Exactamente como funciona una búsqueda de filtro en una columna en Excel).

@deepakramamurth Echa un vistazo a mi segunda respuesta, he demostrado que la técnica funcionará, hay un archivo PBIX adjunto.


---------------------------------------

@ me in replies or I'll lose your thread!!!

I have a NEW book! 
DAX Cookbook from Packt
Over 120 DAX Recipes!




Did I answer your question? Mark my post as a solution!

Proud to be a Super User!




@Greg_Deckler Muchas gracias por la solución. Casi se soluciona mi problema. Pero sólo necesito una pequeña extensión a esto. Me disculpo por no mencionarlo antes.

Tabla A Tabla B

BARCALAYS Corporation Ltd Barcalays (LLP)

CaSey's CaseyLLP

Necesito que el resultado se recupere en las columnas de resultados como "Barcalays" -> sin distinción entre mayúsculas y minúsculas y al igual que el campo de búsqueda funciona en un filtro de Excel. Para Caseys el resultado debe ser "Casey".

@deepakramamurth - Creo, ver PBIX actualizado adjunto.

Column = 
  VAR __ClientName = [Client Name]
  VAR __Table =
    ADDCOLUMNS(
      ADDCOLUMNS(
        'Table (24a)',
        "Search",SEARCH([Ongoing Projects],__ClientName,,0)
      ),
      "Result",IF([Search]>0,[Ongoing Projects],BLANK())
    )
RETURN
  MAXX(__Table,[Result])


---------------------------------------

@ me in replies or I'll lose your thread!!!

I have a NEW book! 
DAX Cookbook from Packt
Over 120 DAX Recipes!




Did I answer your question? Mark my post as a solution!

Proud to be a Super User!




@Greg_Deckler Hola Greg, no veo ningún cambio en el último PBIX. Es lo mismo que el anterior. Las tablas primarias también son las mismas que las anteriores sin cambios para Barcalays (LLP) y CaSey. Probablemente se perdió al adjuntar el PBIX actualizado.

@deepakramamurth - No estoy seguro, pensé que había adjuntado el adjunto aquí. Aquí está la captura de pantalla:

Greg_Deckler_0-1599419133947.png

Acabo de salvar y apetear de nuevo.


---------------------------------------

@ me in replies or I'll lose your thread!!!

I have a NEW book! 
DAX Cookbook from Packt
Over 120 DAX Recipes!




Did I answer your question? Mark my post as a solution!

Proud to be a Super User!




Ge

@Greg_Deckler No veo ningún cambio en esta captura de pantalla también (incluso comprobó el archivo).

Aquí está la declaración exacta del problema.

Reemplazar la Tabla 24(a) Barclays por Barclays (ABC)

Reemplazar la Tabla 24[Nombre del Cliente] General de Casey por CaSey General

Reemplazar tabla24[Nombre del cliente] ASTRAZENCALimitado por 2020 ASTRAZENCALimited AMT

Ahora quiero que el resultado se muestre como Barclays, Casey, Astrazenca

El resultado debe ser el conjunto completo de caracteres coincidentes, incluidos el espacio y los caracteres especiales, si los hay, y no el valor de la Tabla 24(a). (Para por ejemplo: Casey)


No estoy muy seguro de si necesitamos implementar búsquedas difusas. No he explorado mucho de ella.

@deepakramamurth - OK, supongo que estaba confundido porque usted tiene el PBIX y puede hacer esos cambios por su cuenta?

Greg_Deckler_0-1599420562711.png

El único cambio que no pude hacer fue tener Barclays (ABC) partido BARCLAYS (LLP) porque esas dos cosas no coinciden. Tendría que coincidir con Barclays<>BARCLAYS que hace y devuelve Barclays. No hay coincidencia difusa con FIND. Sólo distingue mayúsculas de minúsculas.

No la fórmula. Devuelve en la columna cualquier palabra de búsqueda (Proyecto) que coincida con la fila actual. No está haciendo nada con respecto a la manipulación del texto en Nombre de cliente, simplemente devuelve el valor de proyecto en curso coincidente. Por lo tanto, puede poner lo que quiera en la Tabla24 en cuanto a caracteres adicionales, etc. no importa un bit pequeño, siempre y cuando se encuentre una coincidencia en la tabla (24a) entonces esa coincidencia se devuelve como el valor. No hice ningún cambio en el código, sólo los cambios en las tablas de datos, que tiene el PBIX, puede hacerlo.


---------------------------------------

@ me in replies or I'll lose your thread!!!

I have a NEW book! 
DAX Cookbook from Packt
Over 120 DAX Recipes!




Did I answer your question? Mark my post as a solution!

Proud to be a Super User!




@Greg_Deckler ¿Ves el problema? Tengo el nombre del proyecto en 24(a) como Casey's (tenga en cuenta el apóstrofo) que es lo mismo que Barclays (ABC).
Si sustituyo 24(a) por Casey's, la columna de resultado no devolverá Casey porque falta el apóstrofo en CaSeY General (Tabla 24). Lo mismo ocurre con Barclays ya que (ABC) falta en la Tabla 24.

Mis datos son tales que la lista de proyectos no es la coincidencia exacta con el nombre del cliente. Algunos proyectos son de la naturaleza anterior. Por lo tanto, necesito hacer coincidir el conjunto continuo de cadenas y, a continuación, devolver ese conjunto como resultado.

Así que el resultado para Casey's y Barclays (ABC) sería Casey y Barclay, respectivamente, teniendo en cuenta este conjunto de cadenas continuas están presentes en el Cuadro 24.

Espero haber podido explicar mi problema. No estoy seguro de si hay un código, pero me pregunto qué lógica hace la búsqueda de filtros (ctrl +shift+L) seguir para ser capaz de lograr esto.

@deepakramamurth - Lo que está pidiendo no es probablemente muy posible o no lo está explicando muy bien. ¿Cuál es el "umbral" para una coincidencia? Pregunté originalmente si querías emparejarse difusa y dijiste "no". Bueno, lo que estás pidiendo se llama coincidencia difusa. La coincidencia aproximada es cuando se hace coincidir en función de un valor de umbral. Si desea una coincidencia aproximada, tendrá que usar la coincidencia difusa integrada de Power Query en la consulta Merge. Probablemente podría encontrar alguna forma enrevesada de DAX de hacerlo. Implicaría Texto a Tabla (https://community.powerbi.com/t5/Quick-Measures-Gallery/Text-to-Table/m-p/1312929#M594). Siento que intencionalmente me has perdido el tiempo en esto y en un fin de semana festivo nada menos porque te pregunté si querías emparejarse difusa y dijiste que no y luego lo que quieres resulta ser un emparejamiento difuso. Pero nunca habría ido por este camino si hubieras tenido claro que quieres una coincidencia difusa. Honestamente no tiene sentido escribir una solución DAX a juego difusa y créanme que soy el rey de escribir DAX ridículamente poco práctico, pero eso es probablemente incluso un puente demasiado lejos para mí.

En conclusión. Usar lo que quieras se llama coincidencia difusa. Utilice la tecnología de coincidencia aproximada integrada en Power Query Merge (Table.Join). Fin.


---------------------------------------

@ me in replies or I'll lose your thread!!!

I have a NEW book! 
DAX Cookbook from Packt
Over 120 DAX Recipes!




Did I answer your question? Mark my post as a solution!

Proud to be a Super User!




@Greg_Deckler Gracias por su tiempo Greg. Te lo agradezco mucho. Mis disculpas si sentías que perdimos el tiempo. Permítanme probar la función de coincidencia difusa y ver si eso es de alguna ayuda en la resolución de mis requisitos.

@deepakramamurth - Entiendes los problemas al intentar reinventar esta rueda en DAX, ¿verdad? No puedes simplemente hacer coincidir hasta un cierto número de letras desde el principio porque tienes cosas como LLP Ernst and Young y Ernst and Young. No puedes hacer coincidir un cierto número de caracteres de la derecha debido a cosas como BARCLAYS (LLP) frente a Barclays (ABC). No puede usar CONTAINSTRING o FIND o SEARCH porque estamos hablando de coincidencia parcial (difusa). Literalmente tendría que desgarrar cada cadena en su propia tabla usando Text to Table (versión de palabra) donde cada carácter obtiene una fila en una tabla. No hay problema para el nombre del cliente, pero entonces usted está tratando de compararlo con cada otra palabra en la otra tabla. Excepto que DAX no tiene bucle. Por lo tanto, podría forzarlo brutamente si tiene una cantidad establecida de palabras en su segunda tabla, pero algo me dice que la implementación del mundo real de esto no va a tener 5 filas en la segunda tabla, sino más bien unos pocos cientos o miles. Por lo tanto, tendría que hacer texto para poner en la mesa en una tabla codificada de forma rígida varias cientos o miles de veces y sería codificado de forma rígida. Usted *podría* intentar hacer algo complicado usando un índice y tratando de usar GENERATE contra el índice y de alguna manera transformando cada una de las palabras de búsqueda en una tabla de una columna y de alguna manera vincularlo todo con un UNION, pero realmente nunca he imaginado que cómo hacerlo dinámicamente sin codificar todo duro. Entonces, después de haber descubierto hasta ahora cómo hacer 2 o 3 cosas ya imposibles, entonces y sólo entonces usted está listo para empezar a tratar de hacer coincidir secuencias de letras. Aquí tendría la envidiable tarea de iterar a través de su texto a la tabla de todas sus palabras de búsqueda y comprobar cada fila individualmente si coincide con el carácter a en el texto a la tabla de su nombre de cliente. Bien, des hazte de los caracteres (filas) que no coinciden. Ahora, vuelva a recorrer en iteración esta tabla en busca de filas consequetivas. Repetir de nuevo para encontrar más de algún umbral de filas consequetivas. De alguna manera extrae mágicamente esas filas de la tabla. Devuélvelos.

Aparte de de alguna manera superar probablemente 2 o 3 cosas imposibles, y no uso la palabra imposible a la ligera cuando se trata de DAX, seguro, el método anterior funcionará perfectamente. El proceso de pensamiento anterior es lo que pasó por mi cabeza cuando vi por primera vez este problema que fue la razón de la pregunta sobre la coincidencia difusa. Porque ya sabía que el emparejamiento difuso no estaba en las cartas. Definición de coincidencia difusa: Coincidencia aproximada es una técnica utilizada en la traducción asistida por ordenador como un caso especial de vinculación de registros. Funciona con coincidencias que pueden ser inferiores al 100% perfectas al encontrar correspondencias entre el texto de segmentos.


---------------------------------------

@ me in replies or I'll lose your thread!!!

I have a NEW book! 
DAX Cookbook from Packt
Over 120 DAX Recipes!




Did I answer your question? Mark my post as a solution!

Proud to be a Super User!




@Greg_Deckler Gracias por su explicación. El Fuzzy match aint trabaja como se esperaba. Por ejemplo: Client_name es "BARCLAYS CAPITAL". Este nombre de cliente se compara con Project_name - "TriState Capital" en lugar de Barclays (ABC) con un umbral de 0,24 (el umbral mínimo que podría establecer para una salida máxima).

Con el umbral de 1 , BARCLAYS CAPITAL no tiene coincidencias y devuelve NULL.

Debido a lo anterior, realmente dudo si los resultados con coincidencia aproximada son precisos para mis conjuntos de datos. No quiero que un proyecto incorrecto se asigne a un nombre de cliente.

Permítanme averiguar algo, si nada sale a la luz entonces probablemente debería escribir a la administración para ajustar la fuente de datos para que coincida con el nombre del cliente sin el (ABC) o el apóstrofo 🙂

Gracias de nuevo por su tiempo.

@deepakramamurth - OK, así que después de todas mis quejas de lo imposible que era esto en DAX, no podía dejarlo ir porque soy sólo un glotón para el castigo cuando se trata de estas cosas. Por lo tanto, aquí está la primera (que soy consciente de) fórmula de coincidencia de texto difuso en DAX. Es bastante basura, pero demuestra que el concepto es realmente posible. Tengo algunos pensamientos para mejorar su precisión, pero mi cerebro está un poco frito después de esto. Se adjunta PBIX actualizado. Como se puede ver, no es 100% preciso y hace algunas cosas extrañas, pero eso es simplemente una especie de lo que hace DAX (larga explicación sobre toda la carcasa de las letras).

Column 3 = 
    VAR __ClientTable = ADDCOLUMNS(GENERATESERIES(1,LEN([Client Name]),1),"Letter",MID([Client Name],[Value],1))
    VAR __WordSearchTable = 
        GENERATE(
            DISTINCT('Table (24b)'[Index]),
                VAR __Word = MAXX(FILTER('Table (24b)',[Index]=EARLIER([Index])),[Ongoing Projects])
            RETURN ADDCOLUMNS(GENERATESERIES(1,LEN(__Word),1),"Letter",MID(__Word,[Value],1))
        )
    VAR __FilterTable = 
        INTERSECT(
            SELECTCOLUMNS(__WordSearchTable,"Letter",[Letter]),
            SELECTCOLUMNS(__ClientTable,"Letter",[Letter])
        )
    VAR __Table1 = FILTER(__WordSearchTable,[Letter] IN __FilterTable)
    VAR __Table2 = 
        ADDCOLUMNS(
            FILTER(__WordSearchTable,[Letter] IN __FilterTable),
            "Consq",[Value] - MAXX(FILTER(__Table1,[Index]=EARLIER([Index])&&[Value]<EARLIER([Value])),[Value])
        )
    VAR __Table3 = FILTER(__Table2,[Consq]=1)
    VAR __Table = GROUPBY(__Table3,[Index],"Rows",COUNTX(CURRENTGROUP(),[Letter]))
    VAR __Max = MAXX(__Table,[Rows])
    VAR __WordIndex = MAXX(FILTER(__Table,[Rows]=__Max),[Index])
RETURN
    CONCATENATEX(FILTER(__WordSearchTable,[Index]=__WordIndex),[Letter],,[Value])


---------------------------------------

@ me in replies or I'll lose your thread!!!

I have a NEW book! 
DAX Cookbook from Packt
Over 120 DAX Recipes!




Did I answer your question? Mark my post as a solution!

Proud to be a Super User!




@Greg_Deckler Gracias por el archivo. Pasé por la implementación y de alguna manera siento que la lógica está tomando un enfoque diferente. Permítanme anotar la lógica que creo que es un enfoque correcto. No estoy seguro de si esto es implementable con la fórmula actual y las funciones en PBI.

Lógica:

1. Seleccione el valor de la primera celda en la tabla Proyecto (valor que se encuentra en la columna de referencia). Comience con la búsqueda de los primeros 3 caracteres de esta celda en el nombre del cliente (columna Buscar dentro). Devuelve todas las celdas que tienen estos 3 caracteres en el nombre del cliente que aparecen continuamente y guárdalas en una variable. Ahora agregue el 4o carácter y busque las apariencias continuas en Nombre de cliente (Los valores devueltos disminuirán debido a la adición del 4o carácter continuo). Repita la adición de caracteres hasta que no se encuentren coincidencias.

El valor final que se devolverá es el último valor de variable con el máximo de coincidencias continuas.

2. Ahora repita todo el valor en la segunda celda de la Tabla de proyectos.

Esta lógica parece impecable y satisface todos los criterios requeridos. También devuelve "Barcalays" o "Barcalays".

Tampoco coincide con la capital de Tristate y la capital de Barcalays, ya que la búsqueda de carácter siempre comienza desde el primer carácter de la cadena que es Barcalays y no capital.

Y sí, todo el asunto debe ser insensible a mayúsculas y minúsculas.

Espero poder explicarlo de una manera comprensible. La lógica parece fácilmente implementable, pero el trabajo real es encontrar el conjunto correcto de combinaciones de DAX para hacerlo.

@deepakramamurth La lógica parece implementable porque PHP y otros lenguajes de programación tienen estas cosas llamadas bucles. DAX no tiene bucles tan ventosas de distancia el "oh sólo repetir este proceso" porque extremadamente problemático. Por lo tanto, voy a tener que sentarme con esto y averiguar una vez más cómo emular / simular bucles en DAX. No es que no lo haya hecho, pero se necesita una buena cantidad de esfuerzo y enfoque para hacerlo bien.

Además, la lógica que describa devolvería "Barcalays ("


---------------------------------------

@ me in replies or I'll lose your thread!!!

I have a NEW book! 
DAX Cookbook from Packt
Over 120 DAX Recipes!




Did I answer your question? Mark my post as a solution!

Proud to be a Super User!




@deepakramamurth - OK, para implementar esto tuve que torcer tu lógica para hacerla compatible con DAX pero *creo* que logra el resultado que deseas. Y, como mencioné, devuelve "Barclays (" para esa entrada. No estoy completamente seguro de cómo arreglar eso a menos que tengas una idea. No puedo simplemente borrar espacios y no hay ninguna función de "recortar" en DAX para recortar caracteres especiales. Podría crear una tabla de caracteres para eliminar al final de las palabras y SUSTITUIRlos de alguna manera si están al final de una palabra, pero no estoy seguro de las ramificaciones de eso porque usted podría tener un cliente cuyo nombre desea tener un carácter especial al final de su nombre. También podría eliminar potencialmente un espacio final " " pero, de nuevo, no estoy seguro de si tal vez podría surgir una situación en la que desearía borrar dos espacios finales.

De todos modos, nunca pido Kudos pero espero Kudos, es el Día del Trabajo después de todo y estoy aquí codificando la lógica de coincidencia de texto difusa en DAX después de todo.

Se adjunta PBIX actualizado, Tabla (24). Aquí está el DAX:

Column 4 = 
    VAR __WordSearchTable = 
        GENERATE(
            'Table (24b)',
                VAR __Word = MAXX(FILTER('Table (24b)',[Index]=EARLIER([Index])),[Ongoing Projects])
            RETURN ADDCOLUMNS(GENERATESERIES(1,LEN(__Word),1),"Search",LEFT(__Word,[Value]))
        )
    VAR __Table =
        FILTER(
            ADDCOLUMNS(
                __WordSearchTable,
                "Match",SEARCH([Search],[Client Name],,BLANK())
            ),
            NOT(ISBLANK([Match]))
        )
    VAR __Max = MAXX(__Table,[Value])
    VAR __Match = MAXX(FILTER(__Table,[Value]=__Max),[Search])
RETURN
    __Match

---------------------------------------

@ me in replies or I'll lose your thread!!!

I have a NEW book! 
DAX Cookbook from Packt
Over 120 DAX Recipes!




Did I answer your question? Mark my post as a solution!

Proud to be a Super User!




@Greg_Deckler Gracias por esto. La lógica parece funcionar perfectamente, pero sin embargo, la búsqueda está devolviendo todos los valores de Nombre de cliente que contienen el primer conjunto coincidente de series de caracteres de la lista Proyectos. (He adjuntado los archivos en el enlace de unidad que se proporciona a continuación y también adjunto la lista completa de nombres de cliente y los nombres de proyecto en curso para su referencia). Por ahora puedo tener una labor alrededor del alma extendiendo la búsqueda a una nueva columna y devolviendo los resultados de búsqueda de la columna del proyecto en función de los valores devueltos de las fórmulas. Avísame si es posible eliminar esta solución y obtener la solución moviendo tu fórmula. Podemos marcarlo como una solución resuelta si podemos movernos con esta pieza que falta 🙂

Enlace de unidad

@deepakramamurth - Lo siento, ¿qué? No entiendo el tema, ¿puede explicarlo de nuevo con ejemplos?


---------------------------------------

@ me in replies or I'll lose your thread!!!

I have a NEW book! 
DAX Cookbook from Packt
Over 120 DAX Recipes!




Did I answer your question? Mark my post as a solution!

Proud to be a Super User!




Helpful resources

Announcements
secondImage

Happy New Year from Power BI

This is a must watch for a message from Power BI!

December Update

Check it Out!

Click here to read more about the December 2020 Updates!

Community Blog

Check it Out!

Click here to read the latest blog and learn more about contributing to the Power BI blog!

Get Ready for Power BI Dev Camp

Get Ready for Power BI Dev Camp

Mark your calendars and join us for our next Power BI Dev Camp!.

Top Solution Authors