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

Filtro "Text Contains" con lista como argumento

Hola

Ciertamente no soy un experto en consultas de poder.

Me gustaría filtrar una consulta para las filas que contienen cualquier subcadena contenida en una lista. He utilizado lo siguiente, con éxito, para filtrar las coincidencias exactas, pero necesito encontrar filas que solo contengan cualquier subcadena en una lista de subcadenas.

= Table.SelectRows(QueryToBeFiltered, each List.Contains(ListOfArguments, [ColumnToBeFiltered]))

No necesito aplicar esto dinámicamente, pero eso sería una ventaja.

Agradezco cualquier ayuda en esto.

Gracias

Chris

10 REPLIES 10
Syndicate_Admin
Administrator
Administrator

Basándome en su descripción, creé datos para reproducir su escenario. El archivo pbix se adjunta al final.

https://1drv.ms/u/s!AiUZ0Ws7G26RiWCKqxuH34JqaP-R?e=0Mzoqx

Si esta publicación ayuda, entonces considere aceptarla como la solución para ayudar a otros miembros a encontrarla más rápido y dar un gran pulgar hacia arriba.

Syndicate_Admin
Administrator
Administrator

Por favor, pruebe esto

Table.SelectRows(#"Changed Type",(r)=> List.Count(Splitter.SplitTextByAnyDelimiter(MyList)( Text.Combine(Record.ToList(r))))>1)
Syndicate_Admin
Administrator
Administrator

¡Muchas gracias por la pronta respuesta! Logré resolver el problema dividiendo la línea en pasos más pequeños para ver de dónde viene todo. Resulta que acababa de colar corchetes en el último argumento Row([ColumnToBeFiltered]),... lo que rompió todo. Gracias de todos modos, espero poder ayudar a otros con mi error también. ¡Y gracias por la gran explicación del código!

Syndicate_Admin
Administrator
Administrator

La salida de ambas funciones debe ser un valor lógico. Si este no es el caso, obtendrá un "no se puede convertir el tipo X en tipo lógico". El error que está recibiendo es un poco más inusual. Significa que el parámetro se da directamente como un registro donde espera una función que devuelve verdadero o falso. Puedo obtener este error si hago algo como

Table.SelectRows(Table, Table{0})

Las llaves {} llaman a una fila específica (una fila por sí misma siempre se da como un registro en Power Query). Pero supongo que estás haciendo otra cosa. Siempre una cantidad infinita de formas para que algo no funcione.

Aquí hay un archivo PBIX de demostración para jugar: https://1drv.ms/u/s!At7O-RqLrIRtga0hgopcBpVFyDBpfA?e=WWpz28

Si no ayuda, siéntase libre de enviar su código.

Syndicate_Admin
Administrator
Administrator

Hola Josh, esto es exactamente lo que estoy tratando de hacer con mis datos y lo que has propuesto parece completamente lógico. Traté de implementarlo adaptando los parámetros necesarios. Sin embargo, recibo el error de que PQ no puede convertir un valor de tipo Record a tipo Function. En los detalles del error, el valor es mi primera fila de la consulta que se filtrará (esa es la primera fila de TableName para usted), así que supongo que está tratando de convertirlo en una función y no puede. ¿Quizás puedes ayudarme con eso?

Syndicate_Admin
Administrator
Administrator

Parece que los otros respondedores realmente no entendieron su pregunta.

Por lo que puedo decir, lo que está tratando de hacer es buscar más de 1 subcadena en cada celda de una columna.

Entonces, por ejemplo, tienes una tabla

1abcdefg1234567
2ABC123
3ADG147
4EFG567
5ACEG1357
6BCD234

Desea devolver filas que contengan cualquiera de las siguientes subcadenas: 123, 567, 135.

Esto coincidiría con las filas 1, 2, 4 y 5, pero no con las filas 3 o 6.

Entonces, ¿cómo puedes hacerlo? Hay una función List.ContainsAny que casi hace lo que queremos. Querríamos un Text.ContainsAny, que nos permite introducir una lista como segundo argumento. Desafortunadamente, esta función no existe. Entonces, en su lugar, tenemos que ejecutar la función Text.Contains para cada elemento de nuestra lista. Una buena manera de hacerlo es usar List.MatchesAny que devuelve true si alguna función de cada elemento de la lista devuelve true al menos una vez.

Aquí está el código:

Table.SelectRows(TableName, (Row) => List.MatchesAny(SubstringList, (Substring) => Text.Contains(Row[ColumnToBeFiltered], Substring)))

Entonces, lo que sucede es que para cada fila hacemos lo siguiente: para cada Subcadena, verificamos si ColumnToBeFiltered (de la fila actual) contiene esa subcadena usando Text.Contains. Luego tenemos una lista de valores verdaderos y falsos. que se ejecuta a través de List.MatchesAny, que devuelve true si hay al menos un true en la lista.

(Parámetro) => Expresión son funciones en línea, donde todo el contexto de evaluación se guarda en el parámetro. Por lo tanto, "Row" contiene una fila ya que la función Table.SelectRows itera sobre las filas de una tabla. Y "Substring" contiene un elemento de "SubstringList" ya que itera sobre esa lista. Puede nombrar esos parámetros como desee. TableName, SubstringList y ColumnToBeFiltered, por otro lado, se refieren a cosas fuera de esta expresión y deben adaptarse en consecuencia.

Tenga en cuenta que en la documentación tanto Table.SelectRows como List.MatchesAny utilizan la palabra clave "each". Estos no se pueden anidar en esta situación. "Cada [columna]" es en realidad un acortamiento de "(_) => _[columna]", el "_" está implícito. En este caso, si usé cada uno para la fila y la subcadena, entonces cuando intentara usar "_" para referirme a la subcadena, intentaría darme la fila y obtendría un error.

Espero que eso ayude.

parry2k
Super User
Super User

@CJarnutowski sí puedes hacerlo, puedes crear una lista separada o dentro de la misma consulta y usarla

= Table.SelectRows(#"Changed Type", each (List.Contains({"Value1", "Value2"}, [Column1])))

O

= Table.SelectRows(#"Changed Type", each (List.Contains(MyList, [Column1])))

Me gustaría elogiossi mi solución ayudara.👉Si puedes pasar tiempo publicando la pregunta, también puedes hacer esfuerzos para dar a Kudos quien haya ayudado a resolver tu problema. ¡Es una muestra de agradecimiento!

Visítenos enhttps://perytus.com, su ventanilla única para proyectos/formación/consulta relacionados con Power BI.



Subscribe to the @PowerBIHowTo YT channel for an upcoming video on List and Record functions in Power Query!!

Learn Power BI and Fabric - subscribe to our YT channel - Click here: @PowerBIHowTo

If my solution proved useful, I'd be delighted to receive Kudos. When you put effort into asking a question, it's equally thoughtful to acknowledge and give Kudos to the individual who helped you solve the problem. It's a small gesture that shows appreciation and encouragement! ❤


Did I answer your question? Mark my post as a solution. Proud to be a Super User! Appreciate your Kudos 🙂
Feel free to email me with any of your BI needs.

Anonymous
Not applicable

Si entiendo esto correctamente, haría que la columna se filtrara en una lista, para que la función List.Contains se pueda usar con ella?

-Hacer columna de interés en la lista

-Use List.Contains para decirme qué entradas de esta lista contienen cualquier subcadena que se encuentra en mi lista 'argument'

¿Cómo hago una lista dentro de mi consulta existente sin perder todas mis otras columnas?

Cree una referencia a la consulta original y, a continuación, cree la única columna que desee como lista y, a continuación, use esa lista en List.Contains.

La consulta original no se ve afectada.

Vea este artículo que escribí sobre esto hace unas semanas que puede ayudar.



Did I answer your question? Mark my post as a solution!
Did my answers help arrive at a solution? Give it a kudos by clicking the Thumbs Up!

DAX is for Analysis. Power Query is for Data Modeling


Proud to be a Super User!

MCSA: BI Reporting

@CJarnutowski todo es bastante sencillo, en lugar de ir en círculos, si se puede compartir el archivo pbix de muestra, voy a armar algo rápidamente para usted y luego se puede tomar desde allí, tener sentido? Puede compartir a través de una unidad / unidad de Google.



Subscribe to the @PowerBIHowTo YT channel for an upcoming video on List and Record functions in Power Query!!

Learn Power BI and Fabric - subscribe to our YT channel - Click here: @PowerBIHowTo

If my solution proved useful, I'd be delighted to receive Kudos. When you put effort into asking a question, it's equally thoughtful to acknowledge and give Kudos to the individual who helped you solve the problem. It's a small gesture that shows appreciation and encouragement! ❤


Did I answer your question? Mark my post as a solution. Proud to be a Super User! Appreciate your Kudos 🙂
Feel free to email me with any of your BI needs.

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.