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

@deepakramamurth - Voy a echar un vistazo.


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

@ 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 Me alegro de que hayamos llegado, fue un problema interesante. Todavía hay respuestas en este hilo que no ha kudo'd... 🙂

Este puede ser mi registro para el subproceso más largo antes de la solución, 6 páginas!!!


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

@ 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 ¡¡Genio!! Muchas gracias por esto. Literalmente me has ahorrado un grave dolor de cabeza. Desearía poder darte una docena de Kudos jaha!! ¡Paz!

@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

@Greg_Deckler Por alguna extraña razón, agregué datos a mi canal de datos hoy y después de la actualización no veo Blue Cross y Blue Shield of Arizona I así como La entrada Ernst & Young para Blue Cross . Sólo veo BLUE CROSS OF IDAHO CARE PLUS, INC en el volcado de datos (excel). Sin embargo, cuando filtro en la vista de datos del escritorio de BI en la lista de proyectos, hay dos entradas para Blue cross. Idaho cuidado plus y la entrada de Ernst and Young. No estoy seguro de cuál podría ser una razón para esto. No veo la entrada Escudo azul en todo mi conjunto de datos ni en la vista de datos. ¿Te has encontrado con cosas tan extrañas?

En el valor devuelto, podríamos devolver el nombre del proyecto para la coincidencia o el nombre del cliente para la coincidencia. (cualquiera de los dos funciona - Mejor saber cuándo cambiar qué por comodidad).

Todavía estoy tratando de entender alguna parte del código. Puede ser que pueda jugar con los valores de umbral y obtener una coincidencia para Blue cross también para todo tipo de entradas actualmente presentes. Eso es si no se te ocurrió uno antes que yo 🙂

Por favor, comparta las últimas mejoras que podría hacer en la existente para tener mejores resultados. Esperemos que el próximo post de usted podría ser nuestra muy necesaria cerca de la solución perfecta o incluso mejor - Una solución perfecta 😉

@Greg_Deckler Gracias Greg. Eres realmente un genio. Voy a seguir adelante y usar esto para mi presentación de hoy. Esto es muy útil. Gracias por todo su tiempo.
Sin embargo, no entiendo sólo una cosa. ¿Por qué se dio la excepción a Cruz Azul?

Incluso National Grid tiene dos coincidencias con nombres de cliente similares a Blue cross. Mientras esto funciona para National Grid, ¿por qué no funciona para Blue Cross?

(Véase -Ernst and YoungNATIONAL Grid y Ernst and YoungBLUE Cross bajo los nombres de cliente para los que se agregó la excepción de cruz azul). Mientras que el agarre nacional se está mapeando a La cuadrícula YoungNATIONAL, Cruz Azul debe obtener mapeado a YoungBLUE Cross ya que los nombres de los clientes son de naturaleza o estructura similares. ¿Alguna idea de por qué está sucediendo esto? Entonces puede ser que podamos averiguar para eliminar dar esta excepción también y tener una fórmula perfectamente funcionando sin ninguna excepción 🙂
Déjame saberte pensamientos. Voy a seguir adelante y aceptar esto como una solución publicar su confirmación en esta pieza.

@deepakramamurth - OK, descubrí otro enfoque de esto ya que parece que es que los partidos de 3 personajes nos están matando. Introduje un umbral de muerte, así como mover la limpieza hasta el final para que estemos manteniendo el máximo número de caracteres posibles durante nuestro proceso de decisión de coincidencia difusa. PBIX está conectado.

Fuzzy Column = 
    VAR __MatchThreshold = 3
    VAR __CleanMatchThreshold = 4
    VAR __KillThreshold = 3
    VAR __FuzzyThreshold1 = .18
    VAR __FuzzyThreshold2 = .8
    VAR __WordSearchTable = 
        GENERATE(
            'Ongoing Projects',
                VAR __Word = MAXX(FILTER('Ongoing Projects',[Index]=EARLIER('Ongoing Projects'[Index])),[Ongoing Projects])
            RETURN ADDCOLUMNS(GENERATESERIES(3,LEN(__Word),1),"Search",LEFT(__Word,[Value]),"Original",__Word)
        )
    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])
    VAR __Proposed =
        IF(
            LEN(__Match)<=__CleanMatchThreshold,
            SWITCH(TRUE(),
                //__Clean2 = "ABB",__Clean2,
                COUNTROWS(FILTER(__Table,[Value]=__Max))>1,BLANK(),
                LEN(__Match) <= __KillThreshold,BLANK(),
                LEN(__Match) = LEN([Client Name]),__Match,
                LEN(__Match)/LEN([Client Name])>__FuzzyThreshold1 && SEARCH(__Match,[Client Name],,0)=1,__Match,
                LEN(__Match)/LEN([Client Name])>__FuzzyThreshold2,__Match,
                BLANK()
            ),
            SWITCH(TRUE(),
                __Match = "Blue Cross",__Match,
                LEN(__Match)/LEN([Client Name])<__FuzzyThreshold2 && SEARCH(__Match,[Client Name],,0)<>1,BLANK(),
                __Match
            )
        )
        VAR __Clean1 = IF(RIGHT(__Proposed,1)="(",LEFT(__Proposed,LEN(__Proposed)-1),__Proposed)
        VAR __Clean2 = IF(RIGHT(__Clean1,1)=" ",LEFT(__Clean1,LEN(__Clean1)-1),__Clean1)
RETURN
    __Clean2

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

@ 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 La lógica que creo que funcionará es , en lugar de dar las coincidencias teniendo en cuenta el nombre del cliente y las columnas del proyecto, ¿podemos tener en cuenta solo la columna Proyecto y proporcionar el término de coincidencia máxima con la columna de proyecto del nombre del cliente?

Ejemplo:

Nombre del cliente Nombre del proyecto

Red Nacional de Cuadrícula Nacional

Primer ABB Nacional

Operación a seguir como se indica a continuación:

Tome la Red Nacional para su consideración.

Compruebe si hay 'N' en todas las celdas de Nombre de cliente y guarde esta lista en una variable.

Compruebe si hay 'Na' en esta lista guardada y actualice esta variable con la nueva lista menor.

Compruebe si hay 'Nat' en esta lista recién guardada y actualice la variable......... y así sucesivamente hasta que verifiquemos la 'G Nacional'.
Tenemos que parar con el primer carácter después de la primera ocurrencia del espacio porque si no, entonces los valores devueltos tendrán que ser una coincidencia exacta con el nombre del cliente.
Esta lógica anterior garantizará que la Cuadrícula Nacional se asigne solo a la Cuadrícula Nacional y no a la Primera Nacional.

Ahora, el paso anterior se itera teniendo en cuenta ABB.

De esta manera podemos asegurarnos de que cada nombre de proyecto se asigna exactamente a un elemento desde el nombre de cliente y el valor de retun será el nombre de cliente y no las cadenas coincidentes.

Esta fue mi propuesta inicial para el código PHP, pero no estoy seguro de cómo perdí el curso sobre esto. Probablemente me abrumé con los resultados que recibí con DAX.

¿Hay alguna manera de probar la lógica anterior con PBI? Esto parece ser una prueba de tonto al menos para el conjunto actual de nombres de cliente y teniendo en cuenta la forma en que aparecen, podría funcionar en cualquier cliente adicional que pueda agregar a esta lista.

Espero que este método sea posible.

@deepakramamurth - Corrígeme si me equivoco, pero esto fallaría en el caso de los datos de muestra que proporcionó, específicamente:

LLP Ernst and Young tratando de coincidir con Ernst y Young

Si voy con los tres primeros tratando de coincidir, nunca devolverá Ernst y Young porque LLP no es igual a "Ern".

¿Correcto?


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

@ 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 No. Los primeros 3 caracteres y superiores se tomarán de la tabla de referencia (columna) y, a continuación, buscar una coincidencia en la columna de nombre de cliente.

Por lo tanto, 'Ern' coincidirá con la columna de cliente para devolver el resultado de dondequiera que aparezca la cadena 'ern'. Así que de esta manera LLP 'Ern'st y Young serán mapeados a 'Ern'.

Tengo la solución para esta lógica de un amigo mío usando el código PHP. No estoy seguro de cómo tener esto integrado en mi Power BI. He proporcionado el enlace a mi unidad que tiene el archivo de resultado (.csv) y la imagen de código para su referencia. Si pudiera ayudarme con una manera de implementar esto con Power BI que solucionará el problema.

--------------------> Enlace de unidad

Gracias por su tiempo. Te lo agradezco mucho.

@deepakramamurth - Sí, incluso con lo que establecé si fuera posible en DAX, acabarías con el mismo problema exacto. Se encontrará con situaciones en las que no hay una manera firme de decidir si "Barclays Capital" mejor coincide "Barclay's Investments" o "Tristate Capital" por ejemplo. ¿Cómo lo decides? En ese ejemplo, ambos coincidirían con 7 letras consequetivas. Técnicamente "Capital" es 8 por lo que probablemente ganaría. Eso es sólo un ejemplo de lo que se encuentra con escenarios de coincidencia difusa.


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

@ 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 - Confirmé que el enfoque SEARCH funcionará. Véase el cuadro (24) y el cuadro (24a) en el PBIX adjunto a continuación sig. Realizó una pequeña edición para obtener la información en el formato que deseaba:

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!




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