SubstituciĆ³ de text massiu a Power Query amb la funciĆ³ List.Acumulate

Com substituir de manera rĆ pida i massiva el text segons la llista de referĆØncia per fĆ³rmules: ja ho hem resolt. Ara intentem fer-ho a Power Query.

Com passa sovint realitzar aquesta tasca Ć©s molt mĆ©s fĆ cil que explicar Per quĆØ funciona, perĆ² intentem fer les dues coses šŸ™‚

Per tant, tenim dues taules dinĆ miques "intelĀ·ligents" creades a partir d'intervals normals amb una drecera de teclat Ctrl+T o equip Inici ā€“ Format com a taula (Inici ā€” Format com a taula):

SubstituciĆ³ de text massiu a Power Query amb la funciĆ³ List.Acumulate

Vaig trucar a la primera taula dades, la segona taula - directoriutilitzant camp Nom de la taula (Nom de la taula) llengĆ¼eta constructor (Disseny).

Tasca: substituir les adreces de la taula dades totes les ocurrĆØncies d'una columna Trobar Instruccions als seus corresponents homĆ²legs correctes de la columna Suplent. La resta del text de les celĀ·les ha de romandre intacte.

Pas 1. Carregueu el directori a Power Query i convertiu-lo en una llista

DesprĆ©s d'haver establert la celĀ·la activa a qualsevol lloc de la taula de referĆØncia, feu clic a la pestanya dades (Data)o a la pestanya Power Consulta (si teniu una versiĆ³ antiga d'Excel i heu instalĀ·lat Power Query com a complement en una pestanya independent) al botĆ³ De taula/gama (Des de la taula/gama).

La taula de referĆØncia es carregarĆ  a l'editor de consultes de Power Query:

SubstituciĆ³ de text massiu a Power Query amb la funciĆ³ List.Acumulate

Per no interferir, un pas afegit automƠticament tipus modificat (Tipus canviat) al tauler dret, els passos aplicats es poden suprimir de manera segura, deixant nomƩs el pas font (Font):

SubstituciĆ³ de text massiu a Power Query amb la funciĆ³ List.Acumulate

Ara, per realitzar mƩs transformacions i substitucions, hem de convertir aquesta taula en una llista (llista).

DigressiĆ³ lĆ­rica

Abans de continuar, primer entenem els termes. Power Query pot funcionar amb diversos tipus d'objectes:
  • Taula Ć©s una matriu bidimensional que consta de diverses files i columnes.
  • Registre (enregistrament) ā€“ matriu-cadena unidimensional, que consta de diversos camps-elements amb noms, per exemple [Nom = "Masha", Sexe = "f", Edat = 25]
  • llista ā€“ una matriu-columna unidimensional, formada per diversos elements, per exemple {1, 2, 3, 10, 42} or { "Fe esperanƧa Amor" }

Per resoldre el nostre problema, ens interessarĆ  principalment el tipus llista.

El truc aquĆ­ Ć©s que els elements de la llista de Power Query poden ser no nomĆ©s nĆŗmeros o text banals, sinĆ³ tambĆ© altres llistes o registres. Ɖs en una llista (llista) tan complicada, que consta de registres (registres) que hem de girar el nostre directori. En la notaciĆ³ sintĆ ctica de Power Query (entrades entre claudĆ tors, llistes entre claudĆ tors) aixĆ² seria el segĆ¼ent:

{

    [ Trobar = ā€œSt. Petersburg", ReemplaƧa = "St. Petersburgā€] ,

    [ Trobar = ā€œSt. Petersburg", ReemplaƧa = "St. Petersburgā€] ,

    [ Cerca = "Pere", ReemplaƧa = "St. Petersburgā€] ,

etcĆØtera...

}

Aquesta transformaciĆ³ es realitza mitjanƧant una funciĆ³ especial del llenguatge M integrada a Power Query: Taula.ToRecords. Per aplicar-lo directament a la barra de fĆ³rmules, afegiu-hi aquesta funciĆ³ al codi de pas font.

Va ser:

SubstituciĆ³ de text massiu a Power Query amb la funciĆ³ List.Acumulate

DesprƩs:

SubstituciĆ³ de text massiu a Power Query amb la funciĆ³ List.Acumulate

DesprĆ©s d'afegir la funciĆ³ Table.ToRecords, l'aspecte de la nostra taula canviarĆ : es convertirĆ  en una llista de registres. El contingut dels registres individuals es pot veure a la part inferior del panell de visualitzaciĆ³ fent clic al fons de la celĀ·la al costat de qualsevol paraula Registre (perĆ² no en una sola paraula!)

A mĆ©s de l'anterior, tĆ© sentit afegir un cop mĆ©s: per emmagatzemar a la memĆ²ria cau (bufer) la nostra llista creada. AixĆ² obligarĆ  a Power Query a carregar la nostra llista de cerca una vegada a la memĆ²ria i no tornar-la a calcular quan mĆ©s tard hi accedim per substituir-la. Per fer-ho, emboliqui la nostra fĆ³rmula en una altra funciĆ³: Llista.Buffer:

SubstituciĆ³ de text massiu a Power Query amb la funciĆ³ List.Acumulate

Aquesta memĆ²ria cau donarĆ  un augment molt notable de la velocitat (en diverses vegades!) Amb una gran quantitat de dades inicials per esborrar.

AixĆ² completa la preparaciĆ³ del manual.

Queda per clicar Inici ā€“ Tancar i carregar ā€“ Tancar i carregar aā€¦ (Inici ā€” Tancar i carregar ā€” Tancar i carregar a..), seleccioneu una opciĆ³ NomĆ©s cal crear una connexiĆ³ (NomĆ©s crea connexiĆ³) i tornar a Excel.

Pas 2. Carregant la taula de dades

AquĆ­ tot Ć©s banal. Com abans amb el llibre de referĆØncia, ens aixequem a qualsevol lloc de la taula, clicem a la pestanya dades botĆ³ De Taula/Range i la nostra taula dades entra a Power Query. Pas afegit automĆ ticament tipus modificat (Tipus canviat) tambĆ© pots eliminar:

SubstituciĆ³ de text massiu a Power Query amb la funciĆ³ List.Acumulate

No cal fer-hi cap acciĆ³ preparatĆ²ria especial, i passem al mĆ©s important.

Pas 3. Realitzeu substitucions mitjanƧant la funciĆ³ List.Acumulate

Afegim una columna calculada a la nostra taula de dades mitjanƧant l'ordre Afegir una columna: columna personalitzada (Afegeix columna: columna personalitzada): i introduĆÆu el nom de la columna afegida a la finestra que s'obre (per exemple, adreƧa corregida) i la nostra funciĆ³ mĆ gica Llista.Acumular:

SubstituciĆ³ de text massiu a Power Query amb la funciĆ³ List.Acumulate

Queda per clicar OK ā€“ i obtenim una columna amb les substitucions fetes:

SubstituciĆ³ de text massiu a Power Query amb la funciĆ³ List.Acumulate

Tingues en compte que:

  • Com que Power Query distingeix entre majĆŗscules i minĆŗscules, no hi va haver cap substituciĆ³ a la penĆŗltima lĆ­nia, perquĆØ al directori tenim "SPb", no "SPb".
  • Si hi ha diverses subcadenes per substituir alhora a les dades d'origen (per exemple, a la setena lĆ­nia cal substituir tant "S-Pb" com "Fullet"), aixĆ² no crea cap problema (a diferĆØncia de la substituciĆ³ per fĆ³rmules de el mĆØtode anterior).
  • Si no hi ha res a substituir al text d'origen (9a lĆ­nia), no es produeixen errors (a diferĆØncia, de nou, de la substituciĆ³ per fĆ³rmules).

La velocitat d'aquesta peticiĆ³ Ć©s molt, molt decent. Per exemple, per a una taula de dades inicials amb una mida de 5000 files, aquesta consulta es va actualitzar en menys d'un segon (sense emmagatzemar a la memĆ²ria intermĆØdia, per cert, uns 3 segons!)

Com funciona la funciĆ³ List.Acumulate

En principi, aquest podria ser el final (per a mi per escriure, i per a tu per llegir) aquest article. Si no nomĆ©s voleu poder, sinĆ³ tambĆ© entendre com funciona "sota el capĆ³", haureu de submergir-vos una mica mĆ©s en el forat del conill i fer front a la funciĆ³ List.Acumulate, que va fer tota la substituciĆ³ a granel. treballar per a nosaltres.

La sintaxi d'aquesta funciĆ³ Ć©s:

=Llista.Acumular(llista, llavor, acumulador)

where

  • llista Ć©s la llista dels elements de la qual estem iterant. 
  • llavor - estat inicial
  • acumulador ā€“ una funciĆ³ que realitza alguna operaciĆ³ (matemĆ tica, text, etc.) sobre el segĆ¼ent element de la llista i acumula el resultat del processament en una variable especial.

En general, la sintaxi per escriure funcions a Power Query tƩ aquest aspecte:

(argument1, argument2, ā€¦ argumentN) => algunes accions amb arguments

Per exemple, la funciĆ³ de suma es podria representar com:

(a, b) => a + b

Per a List.Accumulate , aquesta funciĆ³ acumuladora tĆ© dos arguments obligatoris (es poden anomenar qualsevol cosa, perĆ² els noms habituals sĆ³n van ser Šø corrent, com a l'ajuda oficial d'aquesta funciĆ³, on:

  • van ser ā€“ una variable on s'acumula el resultat (el seu valor inicial Ć©s l'esmentat anteriorment llavor)
  • corrent ā€“ el segĆ¼ent valor iterat de la llista llista

Per exemple, fem una ullada als passos de la lĆ²gica de la construcciĆ³ segĆ¼ent:

=Llista.Acumular({3, 2, 5}, 10, (estat, corrent) => estat + corrent)

  1. Valor variable van ser s'estableix igual a l'argument inicial llavorIe estat = 10
  2. Prenem el primer element de la llista (corrent = 3) i afegiu-lo a la variable van ser (deu). Obtenim estat = 13.
  3. Prenem el segon element de la llista (corrent = 2) i a mƩs al valor acumulat actual a la variable van ser (deu). Obtenim estat = 15.
  4. Prenem el tercer element de la llista (corrent = 5) i a mƩs al valor acumulat actual a la variable van ser (deu). Obtenim estat = 20.

Aquest Ć©s el darrer acumulat van ser el valor Ć©s la nostra funciĆ³ List.Acumulate i les sortides com a resultat:

SubstituciĆ³ de text massiu a Power Query amb la funciĆ³ List.Acumulate

Si fantasiegeu una mica, usant la funciĆ³ Llista.Acumular, podeu simular, per exemple, la funciĆ³ d'Excel CONCATENAR (a Power Query, el seu anĆ leg s'anomena Text.Combinar) utilitzant l'expressiĆ³:

SubstituciĆ³ de text massiu a Power Query amb la funciĆ³ List.Acumulate

O fins i tot cercar el valor mĆ xim (imitaciĆ³ de la funciĆ³ MAX d'Excel, que a Power Query s'anomena Llista. MĆ x):

SubstituciĆ³ de text massiu a Power Query amb la funciĆ³ List.Acumulate

Tanmateix, la caracterĆ­stica principal de List.Accumulate Ć©s la capacitat de processar no nomĆ©s llistes de text o numĆØriques simples com a arguments, sinĆ³ objectes mĆ©s complexos, per exemple, llistes-de-llistes o llistes-de-registres (hola, Directori!)

Vegem de nou la construcciĆ³ que va realitzar la substituciĆ³ en el nostre problema:

Llista.Acumular(directori, [AdreƧa], (estat,actual) => Text.ReemplaƧa (estat, actual[Trobar], actual[ReemplaƧa]) )

QuĆØ estĆ  passant realment aquĆ­?

  1. Com a valor inicial (llavor) agafem el primer text maldestre de la columna [AdreƧa] la nostra taula: 199034, Sant Petersburg, str. Beringa, d. 1
  2. A continuaciĆ³, List.Acumulate itera sobre els elements de la llista un per un: Instruccions. Cada element d'aquesta llista Ć©s un registre format per un parell de camps "QuĆØ trobar - Amb quĆØ substituir" o, en altres paraules, la segĆ¼ent lĆ­nia del directori.
  3. La funciĆ³ acumulador posa en una variable van ser valor inicial (primera adreƧa 199034, Sant Petersburg, str. Beringa, d. 1) i hi realitza una funciĆ³ d'acumulador: l'operaciĆ³ de substituciĆ³ utilitzant la funciĆ³ M estĆ ndard Text.ReemplaƧa (anĆ loga a la funciĆ³ SUBSTITUTE d'Excel). La seva sintaxi Ć©s:

    Text.Replace (text original, quĆØ estem buscant, amb quĆØ estem substituint)

    i aquĆ­ tenim:

    • van ser Ć©s la nostra adreƧa bruta, que es troba a van ser (Arribant-hi des de llavor)
    • actual[Cerca] - valor del camp Trobar de la segĆ¼ent entrada iterada de la llista directori, que rau a la variable corrent
    • actual[ReemplaƧar] - valor del camp Suplent de la segĆ¼ent entrada iterada de la llista directoriestirat a dins corrent

AixĆ­, per a cada adreƧa, s'executa cada cop un cicle complet d'enumeraciĆ³ de totes les lĆ­nies del directori, substituint el text del camp [Troba] pel valor del camp [ReemplaƧa].

Espero que hagis tingut la idea šŸ™‚

  • SubstituĆÆu de manera massiva el text d'una llista mitjanƧant fĆ³rmules
  • Expressions regulars (RegExp) a Power Query

Deixa un comentari