Estoy buscando categorizar/ordenar una lista haciendo coincidir ciertas cadenas. Anteriormente no pude encontrar una solución, así que espero que así sea más fácil.
Lista de ejemplo:
[A]
The apple is the pomaceous fruit of the apple tree
Apples grow on deciduous trees which are large if grown from seed
Apples are an important ingredient in many desserts, such as apple pie
Puréed apples are generally known as apple sauce
A banana is an edible fruit produced by several kinds of large plants
Worldwide, there is no sharp distinction between "bananas" and "plantains"
The term "banana" is also used as the common name for the plants
Orange is the colour of saffron, pumpkins and apricots
The colour orange is named after the appearance of the ripe orange fruit
In ancient Egypt, artists used an orange mineral pigment called realgar
Apple, orange and banana smoothie
Eating an orange and banana exceed allowable sugar intake
Kale or borecole (Brassica oleracea Acephala Group) is a vegetable
Until the end of the Middle Ages, kale was one of the most common green vegetables
Cadenas que se buscan y cómo se clasificarán (sin distinguir entre mayúsculas y minúsculas):
Apple = Apple
Apple Pie = Dessert
Banana = Banana
Orange = Orange
(anything not categorized) = Vegetables
(multiple found strings) = Multiple --> if this isn't possible it's fine
Esto es lo que podría decir la columna al lado de la lista:
[B]
Apple
Apple
Pie
Apple
Banana
Banana
Banana
Orange
Orange
Orange
Multiple
Multiple
Vegetables
Vegetables
Y luego simplemente usaría ordenar/filtrar. ¡Gracias!
Respuesta1
Resolvería esto con el complemento Power Query. Se necesitan algunos pasos para llegar allí, pero no se requiere código ni cambios en la estructura de datos de entrada.
Creé un prototipo que puedes ver o descargar: su "demostración de Power Query: búsqueda de una lista de palabras clave y categorización" en mi One Drive:
https://onedrive.live.com/redir?resid=4FA287BBC10EC562%21398
Básicamente, mi técnica fue crear una consulta preliminar para cargar la lista de categorías y asignar una clave de combinación ficticia, luego fusionarla con el texto que se buscará usando una clave de combinación ficticia. Esto produce una fila para cada fila de entrada x cada categoría. Luego calculé la categoría usando la función Text.Contains y finalmente usé Group By para volver al conjunto original de filas.
En ese punto, tiene una tabla normalizada que es ideal para la exploración mediante el filtrado o el uso de una tabla dinámica y/o un gráfico dinámico.
Respuesta2
El hecho de que quieras que sea dinámico Y hierático (la tarta de manzana tiene prioridad sobre la manzana) lo hace un poco difícil, pero si estás dispuesto a programarlo estáticamente, puedes hacer algo como esto:
Row 1 - Your search text
Row 2 - Your result text
B1=Apple
B2=Apple
B3=If(Len($A2)>LEN(SUBTITUTE(LOWER($A2),LOWER(B$1),"")),B$2,"")
C1=Apple Pie
C2=Deserts
D1=Orange
D2=Orange
Drag B3 across and down
Lo que estás haciendo es sustituir las instancias de "apple" por nada y luego contar las letras para ver si hay menos que la original. Normalmente, esta es una operación que distingue entre mayúsculas y minúsculas, pero primero he usado minúsculas en los dos textos que estoy comparando. Esto generará el texto del resultado en cada columna si hubo un resultado para el texto de búsqueda de esa columna.
Para incorporar la jerarquía, puede cambiar la columna de B a IF(LEN(C2)>0,"",FORMULA NORMAL), de modo que la columna no diga APPLE si la columna C ya tiene un valor. FÓRMULA NORMAL siendo simplemente la fórmula de B3 de arriba.
Entonces podrías usar una cuenta para medir cuántos aciertos tienes.
=IF(COUNTA(B2:D2)=0,"Vegitables",IF(COUNTA(B2:D2)>1,"Multiple",B2&C2&D2))
Si hay 0 coincidencias, vegitables, si son múltiples, entonces múltiples; de lo contrario, solo se completará un campo para que pueda obtener su respuesta final concatinando los resultados.
Además, se me ocurrió una fórmula que simplemente toma una lista dinámica y calcula cuántas visitas tienes. Esta es una función de matriz, por lo que tendrás que escribirla sin {} y luego, en lugar de presionar Enter, presiona Ctrl+Mayús+Enter.
{=SUM(--(LEN(A2)-LEN(SUBSTITUTE(LOWER(A2),LOWER($F$1:$F$6),""))>0))}
Sin embargo, esto falla, ya que podría ser 2 para cualquier cosa que contenga "tarta de manzana", ya que tiene manzana y tarta, pero gana porque puede funcionar con una lista dinámica proporcionada en la columna F.