contingut
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):
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:
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):
Ara, per realitzar mƩs transformacions i substitucions, hem de convertir aquesta taula en una llista (llista).
DigressiĆ³ lĆrica
- 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:
DesprƩs:
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:
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:
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:
Queda per clicar OK ā i obtenim una columna amb les substitucions fetes:
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)
- Valor variable van ser s'estableix igual a l'argument inicial llavorIe estat = 10
- Prenem el primer element de la llista (corrent = 3) i afegiu-lo a la variable van ser (deu). Obtenim estat = 13.
- 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.
- 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:
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Ć³:
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):
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Ć?
- 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
- 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.
- 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