web-dev-qa-db-fra.com

Dans une feuille de calcul Google, comment répertorier les éléments uniques modifiés par une expression rationnelle?

J'ai un tableur Google avec des articles et des prix. La colonne D a les prix, la colonne C a des noms d'éléments, dont certains contiennent plusieurs mots. Lorsqu'un élément contient plusieurs mots, seul le premier est vraiment significatif.

Ce que j'aimerais réaliser est la suivante:

  1. Traiter la liste des éléments pour enlever tout ce qui suit le caractère non alpha,
  2. TRIER (UNIQUE ()) les résultats,
  3. SUM () tous les éléments qui ont été mis en correspondance pour créer cette nouvelle liste.

Je générerai ensuite un camembert (c'est de la nourriture, après tout) avec les résultats. Ainsi, par exemple, je pourrais avoir:

  1    C             | D
  -------------------+------------
  2    Cheese        | $9.08
  3    Milk, 2L      | $3.89
  4    Avocado       | $0.99
  5    Avocado 3/$5  | $5.00
  6    Apples Fuji   | $2.75
  7    Avocado       | $1.49
  8    Milk 4L       | $4.75
  9    Apples        | $2.25

Le résultat final sera:

  Cheese   | $9.08
  Milk     | $8.64
  Avocado  | $7.48
  Apples   | $5.00

Je sais que je peux utiliser REGEXEXTRACT() pour analyser un champ individuel:

=REGEXEXTRACT(C3; "^([A-Za-z]+)")

renvoie Milk, comme je m'y attendais. De plus, je sais que je peux additionner les totaux d'une colonne en utilisant FILTER():

  L                   | M
  --------------------+----------
  =UNIQUE( C2:C )     | =SUM( FILTER( D$2:D; L2=C$2:C ) )
  =CONTINUE(C2, 2, 1) | =SUM( FILTER( D$2:D; L3=C$2:C ) )
  ...

Mais je veux les combiner et additionner les totaux des éléments tels que modifiés par REGEXEXTRACT(). J'espérais pouvoir faire quelque chose comme:

=UNIQUE( REGEXEXTRACT( C2:C; "^([A-Za-z]+)" ) )

et

=SUM( FILTER( D$2:D; L2=REGEXEXTRACT(C$2:C, "^([A-Za-z]+)") ) )

Mais lorsqu'elle est présentée avec une plage, la fonction REGEXEXTRACT() ne fournit qu'une chaîne, pas un tableau. Ceci est confirmé car lorsque j'essaie la formule:

=REGEXEXTRACT(UNIQUE(C2:C); "^([A-Za-z]+)")

l'erreur que j'obtiens est "pas une chaîne: Cheese".

Donc ma question est ... Comment puis-je faire ce travail?

Dois-je créer une feuille de travail "à gratter" en tant que pont? Est-il possible de REGEXEXTRACT() chaque élément d'un résultat UNIQUE() au sein d'une formule?

5
ghoti

Mon approche serait de "normaliser" les données en premier:

=ArrayFormula(IF({1,0};IFERROR(REGEXEXTRACT(A2:A;"^([a-zA-Z]+)"));B2:B))

et ensuite vous pouvez envelopper directement ceci dans une fonction QUERY pour produire le résultat souhaité:

=ArrayFormula(QUERY(IF({1,0};IFERROR(REGEXEXTRACT(A2:A;"^([a-zA-Z]+)"));B2:B);"select Col1, sum(Col2) where Col1 != '' group by Col1 label sum(Col2) ''";0))

Vous pouvez même générer une ligne d'en-tête:

=ArrayFormula(QUERY(IF({1,0};IFERROR(REGEXEXTRACT(A2:A;"^([a-zA-Z]+)"));B2:B);"select Col1, sum(Col2) where Col1 != '' group by Col1 label Col1 'Food Item', sum(Col2) 'Total'";0))

1
AdamL