SubstituciĆ³n de texto masivo en Power Query coa funciĆ³n List.Acumulate

Como substituĆ­r de forma rĆ”pida e masiva o texto segundo a lista de referencias con fĆ³rmulas: xa o solucionamos. Agora imos tentar facelo en Power Query.

Como adoita pasar realizar esta tarefa Ć© moito mĆ”is fĆ”cil que explicar por que funciona, pero imos tentar facer as dĆŗas cousas šŸ™‚

Polo tanto, temos dĆŗas tĆ”boas dinĆ”micas "intelixentes" creadas a partir de rangos ordinarios cun atallo de teclado Ctrl+T ou equipo Inicio - Formato como unha tĆ”boa (Inicio ā€” Formato como tĆ”boa):

SubstituciĆ³n de texto masivo en Power Query coa funciĆ³n List.Acumulate

Chamei Ɣ primeira mesa Data, a segunda mesa - guƭausando campo Nome da tƔboa (Nome da tƔboa) aba Construtor (DeseƱo).

Tarefa: substituĆ­r os enderezos da tĆ”boa Data todas as ocorrencias dunha columna Atopar Manual Ć”s sĆŗas correspondentes contrapartes correctas da columna Suplente. O resto do texto das celas debe permanecer intacto.

Paso 1. Cargue o directorio en Power Query e convƩrteo nunha lista

Despois de establecer a cela activa en calquera lugar da tĆ”boa de referencia, fai clic na pestana Data (Data)ou na pestana Consulta de enerxĆ­a (se tes unha versiĆ³n antiga de Excel e instalaches Power Query como complemento nunha pestana separada) no botĆ³n Da tĆ”boa/rango (De mesa/rango).

A tƔboa de referencia cargarase no editor de consultas de Power Query:

SubstituciĆ³n de texto masivo en Power Query coa funciĆ³n List.Acumulate

Para non interferir, un paso engadido automaticamente tipo modificado (Tipo modificado) no panel dereito, os pasos aplicados pĆ³dense eliminar con seguridade, deixando sĆ³ o paso fonte (Fonte):

SubstituciĆ³n de texto masivo en Power Query coa funciĆ³n List.Acumulate

Agora, para realizar mĆ”is transformaciĆ³ns e substituciĆ³ns, necesitamos converter esta tĆ”boa nunha lista (lista).

DigresiĆ³n lĆ­rica

Antes de continuar, primeiro entendamos os termos. Power Query pode funcionar con varios tipos de obxectos:
  • TĆ”boa Ć© unha matriz bidimensional formada por varias filas e columnas.
  • Gravar (Rexistrar) ā€“ Array-string unidimensional, que consta de varios campos-elementos con nomes, por exemplo [Nome = "Masha", Sexo = "f", Idade = 25]
  • lista ā€“ unha matriz-columna unidimensional, formada por varios elementos, por exemplo {1, 2, 3, 10, 42} or { "Faith Hope Love" }

Para resolver o noso problema, interesarƩmonos principalmente no tipo lista.

O truco aquĆ­ Ć© que os elementos da lista en Power Query poden ser non sĆ³ nĆŗmeros ou texto banais, senĆ³n tamĆ©n outras listas ou rexistros. Ɖ nunha lista (lista) tan complicada, formada por rexistros (rexistros) que necesitamos converter o noso directorio. Na notaciĆ³n sintĆ”ctica de Power Query (entradas entre corchetes, listas entre corchetes) isto serĆ­a asĆ­:

{

    [ Buscar = ā€œSt. Petersburg", SubstituĆ­r = "St. Petersburgoā€] ,

    [ Buscar = ā€œSt. Petersburg", SubstituĆ­r = "St. Petersburgoā€] ,

    [ Buscar = "Pedro", SubstituĆ­r = "St. Petersburgoā€] ,

etc.

}

Tal transformaciĆ³n realĆ­zase mediante unha funciĆ³n especial da linguaxe M integrada en Power Query: TĆ”boa.ToRecords. Para aplicalo directamente na barra de fĆ³rmulas, engade esta funciĆ³n ao cĆ³digo de paso alĆ­ fonte.

Foi:

SubstituciĆ³n de texto masivo en Power Query coa funciĆ³n List.Acumulate

Despois:

SubstituciĆ³n de texto masivo en Power Query coa funciĆ³n List.Acumulate

Despois de engadir a funciĆ³n Table.ToRecords, a aparencia da nosa tĆ”boa cambiarĆ”: converterase nunha lista de rexistros. O contido dos rexistros individuais pĆ³dese ver na parte inferior do panel de visualizaciĆ³n facendo clic no fondo da cela xunto a calquera palabra rexistro (pero non nunha soa palabra!)

Ademais do anterior, ten sentido engadir un trazo mĆ”is: para almacenar na memoria cachĆ© (bĆŗfer) a nosa lista creada. Isto obrigarĆ” a Power Query a cargar a nosa lista de busca unha vez na memoria e non a volver calcular cando mĆ”is tarde accedamos a ela para substituĆ­la. Para iso, envolve a nosa fĆ³rmula noutra funciĆ³n: Lista.Buffer:

SubstituciĆ³n de texto masivo en Power Query coa funciĆ³n List.Acumulate

Este almacenamento en cachƩ darƔ un aumento moi notable da velocidade (en varias veces!) cunha gran cantidade de datos iniciais que se borrarƔn.

Deste xeito complĆ©tase a elaboraciĆ³n do manual.

Queda por premer Inicio ā€“ Pechar e cargar ā€“ Pechar e cargar enā€¦ (Inicio ā€” Pechar e cargar ā€” Pechar e cargar en..), seleccione unha opciĆ³n SĆ³ ten que crear unha conexiĆ³n (SĆ³ crear conexiĆ³n) e volver a Excel.

Paso 2. Cargando a tƔboa de datos

AquĆ­ todo Ć© trillado. Como antes co libro de consulta, subimos a calquera lugar da tĆ”boa, prememos na pestana Data botĆ³n De TĆ”boa/Range e a nosa mesa Data entra en Power Query. Paso engadido automaticamente tipo modificado (Tipo modificado) tamĆ©n pode eliminar:

SubstituciĆ³n de texto masivo en Power Query coa funciĆ³n List.Acumulate

Non son necesarias acciĆ³ns preparatorias especiais para facer con el, e pasamos ao mĆ”is importante.

Paso 3. Realiza substituciĆ³ns mediante a funciĆ³n List.Acumular

Engademos unha columna calculada Ć” nosa tĆ”boa de datos usando o comando Engadir unha columna - Columna personalizada (Engadir columna ā€” Columna personalizada): e introduza o nome da columna engadida na xanela que se abre (por exemplo, enderezo corrixido) e a nosa funciĆ³n mĆ”xica Listar.Acumular:

SubstituciĆ³n de texto masivo en Power Query coa funciĆ³n List.Acumulate

Queda por premer OK ā€“ e obtemos unha columna coas substituciĆ³ns realizadas:

SubstituciĆ³n de texto masivo en Power Query coa funciĆ³n List.Acumulate

TeƱa en conta que:

  • Dado que Power Query distingue entre maiĆŗsculas e minĆŗsculas, non houbo substituciĆ³n na penĆŗltima liƱa, porque no directorio temos "SPb", non "SPb".
  • Se hai varias subcadeas para substituĆ­r Ć” vez nos datos de orixe (por exemplo, na sĆ©tima liƱa cĆ³mpre substituĆ­r tanto "S-Pb" como "Prospectus"), isto non xera ningĆŗn problema (a diferenza de substituĆ­r con fĆ³rmulas de mĆ©todo anterior).
  • Se non hai nada que substituĆ­r no texto fonte (9ĀŖ liƱa), non se produce ningĆŗn erro (a diferenza, de novo, coa substituciĆ³n por fĆ³rmulas).

A velocidade de tal solicitude Ć© moi, moi decente. Por exemplo, para unha tĆ”boa de datos iniciais cun tamaƱo de 5000 filas, esta consulta actualizouse en menos dun segundo (sen almacenar no bĆŗfer, por certo, uns 3 segundos!)

Como funciona a funciĆ³n List.Acumular

En principio, este poderĆ­a ser o final (para que eu escriba, e que ti leas) este artigo. Se queres non sĆ³ poder, senĆ³n tamĆ©n comprender como funciona "baixo o capĆ³", entĆ³n terĆ”s que mergullar un pouco mĆ”is na madriguera do coello e xestionar a funciĆ³n List.Acumulate, que fixo toda a substituciĆ³n masiva. traballa para nĆ³s.

A sintaxe desta funciĆ³n Ć©:

=Lista.Acumular(lista, semente, acumulador)

onde

  • lista Ć© a lista sobre cuxos elementos estamos iterando. 
  • semente - estado inicial
  • acumulador ā€“ unha funciĆ³n que realiza algunha operaciĆ³n (matemĆ”tica, de texto, etc.) sobre o seguinte elemento da lista e acumula o resultado do procesamento nunha variable especial.

En xeral, a sintaxe para escribir funciĆ³ns en Power Query ten o seguinte aspecto:

(argumento1, argumento2, ā€¦ argumentoN) => algunhas acciĆ³ns con argumentos

Por exemplo, a funciĆ³n de suma pode representarse como:

(a, b) => a + b

Para List.Acumulate , esta funciĆ³n acumuladora ten dous argumentos obrigatorios (pĆ³dense chamar calquera cousa, pero os nomes habituais son foron Šø actual, como na axuda oficial para esta funciĆ³n, onde:

  • foron ā€“ unha variable onde se acumula o resultado (o seu valor inicial Ć© o mencionado anteriormente semente)
  • actual ā€“ o seguinte valor iterado da lista lista

Por exemplo, vexamos os pasos da lĆ³xica da seguinte construciĆ³n:

=Lista.Acumular({3, 2, 5}, 10, (estado, actual) => estado + actual)

  1. Valor variable foron Ć© igual ao argumento inicial sementeIe estado = 10
  2. Tomamos o primeiro elemento da lista (corrente = 3) e engƔdeo Ɣ variable foron (dez). Obtemos estado = 13.
  3. Tomamos o segundo elemento da lista (corrente = 2) e mƔis el ao valor acumulado actual na variable foron (dez). Obtemos estado = 15.
  4. Tomamos o terceiro elemento da lista (corrente = 5) e mƔis el ao valor acumulado actual na variable foron (dez). Obtemos estado = 20.

Este Ć© o Ćŗltimo acumulado foron o valor Ć© a nosa Lista.Acumula funciĆ³n e resultados como resultado:

SubstituciĆ³n de texto masivo en Power Query coa funciĆ³n List.Acumulate

Se fantaseas un pouco, entĆ³n usando a funciĆ³n Lista.Acumular, podes simular, por exemplo, a funciĆ³n de Excel CONCATENAR (en Power Query, o seu anĆ”logo chĆ”mase Texto.Combinar) utilizando a expresiĆ³n:

SubstituciĆ³n de texto masivo en Power Query coa funciĆ³n List.Acumulate

Ou mesmo buscar o valor mĆ”ximo (imitaciĆ³n da funciĆ³n MAX de Excel, que en Power Query se chama Lista.MĆ”x):

SubstituciĆ³n de texto masivo en Power Query coa funciĆ³n List.Acumulate

Non obstante, a principal caracterĆ­stica de List.Accumulate Ć© a capacidade de procesar non sĆ³ texto simple ou listas numĆ©ricas como argumentos, senĆ³n tamĆ©n obxectos mĆ”is complexos, por exemplo, listas-de-listas ou listas-de-rexistros (Ā”ola, Directorio!)

Vexamos de novo a construciĆ³n que realizou a substituciĆ³n no noso problema:

Lista.Acumular(guĆ­a, [Enderezo], (estado,actual) => Texto.SubstituĆ­r(estado, actual[Buscar], actual[SubstituĆ­r]) )

Que estĆ” pasando realmente aquĆ­?

  1. Como valor inicial (semente) collemos o primeiro texto torpe da columna [Enderezo] a nosa mesa: 199034, San Petersburgo, str. Beringa, d. 1
  2. EntĆ³n List.Acumulate itera sobre os elementos da lista un por un - Manual. Cada elemento desta lista Ć© un rexistro composto por un par de campos "Que atopar - Que substituĆ­r" ou, noutras palabras, a seguinte liƱa do directorio.
  3. A funciĆ³n acumulador pon nunha variable foron valor inicial (primeiro enderezo 199034, San Petersburgo, str. Beringa, d. 1) e realiza nela unha funciĆ³n de acumulador: a operaciĆ³n de substituciĆ³n mediante a funciĆ³n M estĆ”ndar Texto. SubstituĆ­r (anĆ”logo Ć” funciĆ³n SUBSTITUTE de Excel). A sĆŗa sintaxe Ć©:

    Text.Replace (texto orixinal, o que estamos a buscar, o que estamos a substituĆ­r)

    e aquĆ­ temos:

    • foron Ć© o noso enderezo sucio, que se atopa en foron (chegando alĆ­ dende semente)
    • actual[Buscar] - valor de campo Atopar a partir da seguinte entrada iterada da lista guĆ­a, que reside na variable actual
    • actual[substituĆ­r] - valor de campo Suplente a partir da seguinte entrada iterada da lista guĆ­adeitado actual

AsĆ­, para cada enderezo, execĆŗtase cada vez un ciclo completo de enumeraciĆ³n de todas as liƱas do directorio, substituĆ­ndo o texto do campo [Buscar] polo valor do campo [SubstituĆ­r].

Espero que teƱades a idea šŸ™‚

  • SubstitĆŗe o texto en masa nunha lista mediante fĆ³rmulas
  • ExpresiĆ³ns regulares (RegExp) en Power Query

Deixe unha resposta