Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
Anonymous
Not applicable

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!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...

View solution in original post

54 REPLIES 54
Anonymous
Not applicable

@Greg_Deckler La fórmula que dio devuelve valores innecesarios como se menciona a continuación.

Nombre del cliente: Proyectos en curso

Gander ABC Anderson
Anderson Tech Ionis

Pacto de soluciones dinámicas

Microsoft Corp Microsoft

Embarcadero Cap Barclays

Datos de resultados

Resultado del nombre del cliente

Gander ABC Ander (ya que 'Ander' está presente en Anderson)

Anderson Tech Anderson (Sin problemas)

Pivot Solutions Ion (ya que 'Ion' está presente en Ionis)

Embarcadero Cap Barc (ya que 'Barc' está presente en Barclays)

Microsoft Corp Microsoft (sin problemas)

He compartido los dos archivos ('nombre del cliente' y 'proyectos en curso') en la unidad para su referencia. Como se puede ver en la imagen .png, los resultados se vuelven a ajustar según el ejemplo anterior.

@deepakramamurth - Solo aumenta tu umbral de coincidencia. Es la sentencia GENERATESERIES donde actualmente comienza en 1, establezca el umbral en 5, por ejemplo. Por lo tanto, tendrá que coincidir con al menos 5 caracteres para ser considerado una coincidencia. De hecho, llamé a esto en la versión ligeramente mejorada que publiqué en la Galería de Medidas Rápidas.

https://community.powerbi.com/t5/Quick-Measures-Gallery/Fuzzy/td-p/1352914

De lo contrario, abra a consejos sobre cómo desea que funcione el algoritmo. Es coincidencia difusa después de todo, difícil de eliminar el 100% de los falsos positivos. Va con el territorio. ¿Podría ser posible hacer algún tipo de lógica donde intenta evaluar la posición de la coincidencia dentro del nombre del cliente tal vez? Podría ponerse peludo.

Sólo quiero señalar que he pasado horas y horas en esta cosa, ni un solo Kudo. Sólo digo.


@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...
Anonymous
Not applicable

@Greg_Deckler Lo sentimos, marcó el post como solución por error. Se revirtió lo mismo.

No puedo establecer el umbral en 5 porque hay algunos proyectos en curso con solo 3 caracteres (como: ABB) que coinciden con el nombre del cliente. He probado varias opciones limpias basadas en su lógica, pero hay ambiguedad (Por ejemplo, 'Casey; no tiene espacio después de la coincidencia, 'Ion' no tiene espacio después de la coincidencia). Esto me ha dado un dolor de cabeza muy fuerte. Sólo puedo imaginar el dolor por el que debes haber pasado.

@deepakramamurth - ¿Qué pasa si establecemos un segundo umbral y si la coincidencia está por debajo de ese umbral debe ser una coincidencia exacta? ¿Qué opinas de ese enfoque? Ahora que entiendo el problema, voy a echar un vistazo a la construcción de esto con todos sus datos y ver lo que puedo hacer.


@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...

@deepakramamurth He aquí una implementación de la lógica que propuse. PBIX se adjunta a continuación sig con el conjunto de datos completo.

Fuzzy Column = 
    VAR __MatchThreshold = 3
    VAR __CleanMatchThreshold = 5
    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]))
        )
    VAR __Table =
        FILTER(
            ADDCOLUMNS(
                __WordSearchTable,
                "Match",SEARCH([Search],[Column1],,BLANK())
            ),
            NOT(ISBLANK([Match]))
        )
    VAR __Max = MAXX(__Table,[Value])
    VAR __Match = MAXX(FILTER(__Table,[Value]=__Max),[Search])
    VAR __Clean1 = IF(RIGHT(__Match,1)="(",LEFT(__Match,LEN(__Match)-1),__Match)
    VAR __Clean2 = IF(RIGHT(__Clean1,1)=" ",LEFT(__Clean1,LEN(__Clean1)-1),__Clean1)
RETURN
    IF(
        LEN(__Clean2)<=__CleanMatchThreshold,
        IF(
            LEN(__Clean2) = LEN([Column1]),
            __Clean2,
            BLANK()
        ),
        __Clean2
    )

@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...

@deepakramamurth - Mejora adicional

Fuzzy Column = 
    VAR __MatchThreshold = 3
    VAR __CleanMatchThreshold = 4
    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]))
        )
    VAR __Table =
        FILTER(
            ADDCOLUMNS(
                __WordSearchTable,
                "Match",SEARCH([Search],[Column1],,BLANK())
            ),
            NOT(ISBLANK([Match]))
        )
    VAR __Max = MAXX(__Table,[Value])
    VAR __Match = MAXX(FILTER(__Table,[Value]=__Max),[Search])
    VAR __Clean1 = IF(RIGHT(__Match,1)="(",LEFT(__Match,LEN(__Match)-1),__Match)
    VAR __Clean2 = IF(RIGHT(__Clean1,1)=" ",LEFT(__Clean1,LEN(__Clean1)-1),__Clean1)
RETURN
    IF(
        LEN(__Clean2)<=__CleanMatchThreshold,
        SWITCH(TRUE(),
            LEN(__Clean2) = LEN([Column1]),__Clean2,
            SEARCH(__Clean2,[Column1],,0)=1,__Clean2,
            BLANK()
        ),
        __Clean2
    )

@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...
Anonymous
Not applicable

@Greg_Deckler He adjuntado un archivo de nombre de cliente final. La operación debe hacerse con esta multa. La lista de proyectos en curso sigue siendo la misma. Mis resultados en este archivo de cliente final devuelve algunos datos no deseados como Anders, Unidad, Con, Comm, Nacional, Ni,Tri,Ste,Mar.
Aquí es donde veo que el umbral no es eficaz. No es capaz de pensar en una manera de improvisar en la fórmula para eliminar estos errores.

La buena nota es que los valores en blanco reajustado son perfectamente como deberían ser, ya que no hay coincidencias para ellos en la lista de proyectos.

Enlace de unidad

@deepakramamurth - ¿Qué tal esta versión? He implementado un algorthim más inteligente teniendo en cuenta cuánto del nombre total del cliente se corresponde. Además, hay un proceso de excepción en la instrucción SWITCH donde puede llamar coincidencias específicas, como el ejemplo, "ABB". Así que si ABB coincide, lo devuelve. Puede agregar filas adicionales a la instrucción SWITCH para otras excepciones. Tengo la excepción comentada porque no es necesaria con los umbrales actuales, pero la dejé allí como ejemplo. Actualizado PBIX adjunto.

Fuzzy Column = 
    VAR __MatchThreshold = 3
    VAR __CleanMatchThreshold = 5
    VAR __FuzzyThreshold1 = .3
    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]))
        )
    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 __Clean1 = IF(RIGHT(__Match,1)="(",LEFT(__Match,LEN(__Match)-1),__Match)
    VAR __Clean2 = IF(RIGHT(__Clean1,1)=" ",LEFT(__Clean1,LEN(__Clean1)-1),__Clean1)
RETURN
    IF(
        LEN(__Clean2)<=__CleanMatchThreshold,
        SWITCH(TRUE(),
            //__Clean2 = "ABB",__Clean2,
            LEN(__Clean2) = LEN([Client Name]),__Clean2,
            LEN(__Clean2)/LEN([Client Name])>__FuzzyThreshold1 && SEARCH(__Clean2,[Client Name],,0)=1,__Clean2,
            LEN(__Clean2)/LEN([Client Name])>__FuzzyThreshold2,__Clean2,
            BLANK()
        ),
        __Clean2
    )


@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...
Anonymous
Not applicable

@Greg_Decklercasi lo tienes, pero los dos siguientes son algunas excepciones o se están asignando incorrectamente.

1. Nombre del cliente: 'Bose'
'Dell'
'Casey'

Los tres proyectos anteriores no se asignan a ningún cliente aunque estos clientes estén presentes en la lista de clientes. Probablemente debido al umbral mínimo establecido.

2. Nacional está siendo mapeado a más que el cliente de 'National Grid' (hay tres nombres de clientes más con el término Nacional en su nombre)

No quiero crear ninguna excepción a menos que sean exhaustivas en la naturaleza, porque estoy planeando tener un informe fácilmente automatizado empujado al servicio.

Todavía siento que la lógica anterior que mencioné en mi post anterior es más o menos a prueba de tontos. teniendo en cuenta las condiciones y la apariencia dadas de los datos del cliente y del proyecto.

@deepakramamurth - Tendría que pensar en cómo implementar eso dentro del programa, pero ¿qué pasa con Ernst & Young, que sólo coincidiría con Ernst entonces? Tal vez no estoy entendiendo algo.

VAR __FuzzyThreshold1 .18
VAR __FuzzyThreshold2 .8
Estos valores solucionan a Bose, Casey y Dell
También pensamos que el último algoritmo era infalible. La cruda realidad es que la coincidencia difusa nunca será 100% infalible para todos los casos posibles.

@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...
Anonymous
Not applicable

@Greg_Deckler Coincidirá con 'Ernst &' y si la coincidencia está presente en el nombre del cliente, entonces devolverá ese nombre de cliente que será el nombre completo.
La referencia de coincidencia debe seleccionarse de la lista de proyectos y cuando la cadena coincida con un valor en el NAme del cliente, se debe devolver el nombre del cliente.

Hágame saber , También estoy tratando de improvisar en su fórmula mientras hablamos.

@deepakramamurth - No veo cómo esa lógica va a impedir que algo como Internacional sea asignado a National, por ejemplo. Internacional se asignará a la Red Nacional hasta nacional, sin espacio o G y así...

Con el ajuste de .18 para el umbral 1, son las únicas excepciones pendientes:

Greg_Deckler_0-1599599482878.png


@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...
Anonymous
Not applicable

@Greg_Deckler
Así que para 'National Grid', operación de búsqueda hasta 'Nacional' habrá los 5 mapeos como se ve en la captura de pantalla que compartió.
Hasta ahora, los valores de ajuste para el incremento de caracteres a Nombre de proyecto se almacenan en una variable.
Ahora incrementa al siguiente carácter 'G' para buscar 'G nacional' en esta lista de variables que consta de los 5 mapeos.

Puesto que 'National G' solo coincide con 2 asignaciones ahora, estas dos asignaciones sobrescribirán las 5 asignaciones anteriores o la operación elimina las 3 asignaciones no coincidentes (lo que sea eficiente) y la lista de variables ahora devuelve National Grid solo para estos 2 nombres de cliente, lo que está bien porque ambos son National Grid Client.

De esta manera, la búsqueda se puede realizar en todas las celdas de la lista de proyectos hasta 'El primer carácter después del primer espacio'.

@deepakramamurth - Sí, pero "blah blah Blah Blah Internacional blah" todavía va a coincidir con el "Nacional" en "National Grid" de esta manera y ser designado "Nacional" en el partido. No veo esa lógica que impida esto ni explique dónde mi pensamiento es defectuoso.

¿Está diciendo que si el Proyecto en curso tiene un espacio en él para que solo coincida si la coincidencia va más allá del espacio? Porque no estoy seguro de cómo implementar eso aunque tengo algunos pensamientos. Sin embargo, incluso para que todavía no solucione el problema a continuación con WOLTERSKLUWERS.

Pude resolver el problema nacional, aunque con algunos controles adicionales de emparejamiento. Lo único que veo que es una excepción en este punto es que el cliente "WOLTERSKLUWERS" coincide con los "Wolters" en "Wolters Kluwer" cuando probablemente quieres que diga "Wolters Kluwer". No sé de un problema.

Actualizado PBIX adjunto. Aquí está lo último:

Fuzzy Column = 
    VAR __MatchThreshold = 3
    VAR __CleanMatchThreshold = 4
    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]))
        )
    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 __Clean1 = IF(RIGHT(__Match,1)="(",LEFT(__Match,LEN(__Match)-1),__Match)
    VAR __Clean2 = IF(RIGHT(__Clean1,1)=" ",LEFT(__Clean1,LEN(__Clean1)-1),__Clean1)
RETURN
    IF(
        LEN(__Clean2)<=__CleanMatchThreshold,
        SWITCH(TRUE(),
            //__Clean2 = "ABB",__Clean2,
            LEN(__Clean2) = LEN([Client Name]),__Clean2,
            LEN(__Clean2)/LEN([Client Name])>__FuzzyThreshold1 && SEARCH(__Clean2,[Client Name],,0)=1,__Clean2,
            LEN(__Clean2)/LEN([Client Name])>__FuzzyThreshold2,__Clean2,
            BLANK()
        ),
        SWITCH(TRUE(),
            __Clean2 = "Blue Cross",__Clean2,
            LEN(__Clean2)/LEN([Client Name])<__FuzzyThreshold2 && SEARCH(__Clean2,[Client Name],,0)<>1,BLANK(),
            __Clean2
        )
    )

@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...
Anonymous
Not applicable

@Greg_Deckler El último archivo todavía tiene algunos defectos. Columna difusa: 'Tri', 'Ste', 'Unidad' estos tres no tienen proyectos en curso, Tienen que estar en blanco.

Si implementamos la lógica que propuse, entonces estos volverían en blanco. Dado que no hay proyectos con la cadena 'Tri P', Buscar caracteres en el nombre del proyecto 'Sterling' devolverá solo Sterling y 'Ste' no se asignará a Steelwave, 'Unit' no se asignará a 'United' -> similar a Sterling.
Explicación sobre Sterling:
Al buscar los caracteres en la celda 'Sterling' , hasta 'Ste' los valores de retun serán Sterling y Steelwave. Ahora agrega el siguiente carácter y busca de nuevo. 'Ster' devolverá solo 'Sterling' y eliminará Steelwave dejándolo como un espacio en blanco.
Por lo que entiendo es un poco de mapeo inverso de lo que estamos siguiendo ahora.
En lugar de buscar toda la cadena de Nombre de proyecto y devolver todas las coincidencias con las cadenas coincidentes, ¿por qué no establecemos un criterio para buscar solo hasta el primer carácter después del primer espacio en el nombre del proyecto, devolver todos los nombres de cliente coincidentes al incremento del conjunto de cadenas.

Básicamente, a medida que se produce el incremento del carácter de la celda por celda Nombre del proyecto, el número de clientes coincidentes con esta cadena se reducirá dejando solo 1 o 2 nombres de cliente coincidentes.

Básicamente considere esto, A es el nombre del proyecto.

A "Barclays L" --> tomando sólo los caracteres hasta el primero después del primer espacio. Incremento (i++) debe detenerse después del primer carácter después del primer espacio si se encuentra o al final de la cadena sin espacios.

para (A[0]'B', busque coincidencias en el nombre del cliente,i++)

B-Todos los nombres de cliente que coincidan con A[0].
Ahora para (A[0][1]'Ba', busque coincidencias en el nombre del cliente, i++)

B-Todos los nombres de cliente que coincidan con A[0][1]
.

.

.

Ahora para (A[0][1]... [8],buscar coincidencias,i++)

B-Barclays Corporation -> Nombre de cliente que coincide con el nombre del proyecto buscado (reajustando el nombre del cliente en lugar de las cadenas coincidentes)

El bucle termina en [8] porque A0]... [9] 'Barclays L' no está presente en la lista de nombres de clientes. Por lo tanto, Barclays coincidente se asigna hasta A[8] y se devuelve el nombre de cliente asignado es Barclays Corporation.

Espero haber sido capaz de transmitir la lógica. Mis disculpas por la forma anterior de mencionar la lógica.

Y no te preocupes por Wolters. Es el error de nombre de cliente. Tiene que haber un espacio después de Wolter.

@deepakramamurth Excepto que no funciona así. Para implementar el algoritmo original en DAX tuve que hacer esto:

Tomemos sólo los primeros 2 nombres de clientes

1 Aaron's
2 ABB (CA VDA)

Para emular el looping, que es imposible en DAX, esto se convierte en:

1 1 A
1 2 Aa
1 3 Aar
1 4 Aaro
1 5 Aaron
1 6 Aarón'
1 7 Aaron's
2 1 A
2 2 Desactivado
2 3 Figura

y así sucesivamente, toda la lista de proyectos se convierte en una gran mesa como esta. Luego, voy a agregar una columna a esta tabla que dice si coincide con el cliente o no, básicamente un 1 o un 0. Luego, filtro los ceros. Luego agarro el MAX de la segunda columna, ese es mi partido más largo.

Esto es bucle en DAX.

Entonces, ¿explicar de nuevo cómo encaja tu lógica en esto?

Steelwave es un nombre de cliente y coincide con Sterling hasta 3 caracteres. La única coincidencia devuelta es Sterling, no Sterling y Steelwave porque Steelwave no es un nombre de proyecto en curso. Por lo tanto, te quedas con Steelwave haciendo coincidir a Sterling hasta Ste. Puede reducir los umbrales, pero luego empezar a tener problemas con Dell, etc.


@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...
Anonymous
Not applicable

@Greg_Deckler Tienes razón. Mi lógica tiene algunos defectos en caso de que el nombre del proyecto no aparezca en la lista de clientes

@deepakramamurth - OK, este podría ser el indicado. Me des hice del partido de la "Unidad". Así que, básicamente, una vez que ajusté la limpieza de los caracteres y espacios especiales al final, pude aumentar Umbral1 para que ABB se incluye, pero la unidad está excluida. Si estás utilizando un ordenador portátil o una tablet, intenta moverte a otra ubicación e inténtalo de nuevo. Avísame si encuentras algún problema obvio. Actualizado PBIX adjunto.

Fuzzy Column = 
    VAR __MatchWord = [Client Name]
    VAR __CleanMatchThreshold = 4
    VAR __KillThreshold = 3
    VAR __FuzzyThreshold1 = .4
    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],__MatchWord,,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(__MatchWord),__Match,
                LEN(__Match)/LEN(__MatchWord)>__FuzzyThreshold1 && SEARCH(__Match,__MatchWord,,0)=1,__Match,
                LEN(__Match)/LEN(__MatchWord)>__FuzzyThreshold2,__Match,
                BLANK()
            ),
            SWITCH(TRUE(),
                __Match = "Blue Cross" || __Match = "Blue Cross ",__Match,
                LEN(__Match)/LEN(__MatchWord)<__FuzzyThreshold2 && SEARCH(__Match,__MatchWord,,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!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...
Anonymous
Not applicable

@Greg_Deckler Presentado hoy con la excepción, pero obviamente no mencioné sobre la excepción en el código. Sin embargo, estaba pensando, en lugar de volver a ajustar solo los caracteres coincidentes y luego limpiarlo, ¿podemos hacer que la fórmula devuelva todo el valor de celda de la lista Proyecto?

Por ejemplo, en lugar de 'Casey' que se ha emparejado, ya que 'Casey' coincide, el valor devuelto será el valor de celda completo de 'Casey', es decir; Casey's General Store (CARES 2019) --> De la lista de proyectos.

Esto debería ser similar para otras coincidencias.

Ahora soy consciente de varios nombres en la lista de proyectos (Por ejemplo: Barclays tiene 3 variaciones en la lista de proyectos). En tales casos, deje que el valor de retun sea el primer término de coincidencia. es decir; Barclays(VDA).
Lo siento por tratar de improvisar sobre el requisito inicial, pero ¿podría sugerirme una fórmula para lo anterior?

Podemos marcar la respuesta como una solución ya que estoy satisfecho con los resultados. (Excepto por mi preocupación inicial para evitar dar excepción a 'Cruz Azul'). También podría aclarar por qué Blue Cross se comporta de manera diferente a la "Red Nacional".

Te agradezco mucho todo el tiempo @Greg_Deckler que te agradezco mucho. Ustedes son los salvadores 🙂

@deepakramamurth - Así que, sí, podemos devolver todo el proyecto de coincidencia, que podemos hacer. Veré qué puedo hacer con eso. El problema con la Cruz Azul es que los nombres de los clientes son tan largos que termina sin cumplir los requisitos de umbral para una coincidencia. Tal vez pueda ajustarlos. Así que, por ejemplo,

Cruz Azul y Escudo Azul de Arizona I

Coincide con 11 de como 40 caracteres o .275% Esto hace que caiga por debajo de los umbrales establecidos para filtrar otras cosas. La entrada de Ernst & Young para Blue Cross es aún peor.


@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...
Anonymous
Not applicable

@Greg_Deckler He adjuntado la lista actual de nombres de clientes para su referencia. Puede utilizar esta lista en su archivo de trabajo si es conveniente.

Enlace de unidad

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.