PowerQueryIndeparteazaColoaneAllEmpty

Doua add-onuri gratuite oferite de catre Microsoft ce completeaza functionalitatea Excel atat de bine incat incepend cu Excel 2013 Power Pivot vine preinstalat (doar trebuie activat) iar in Excel 2016 Power Query este inclus direct in interfata Excel (nu mai este add-on)
Tzica
Mesaje: 639
Membru din: Sâm Aug 11, 2012 10:52 pm

PowerQueryIndeparteazaColoaneAllEmpty

Mesaj de Tzica » Mar Iul 14, 2020 10:15 am

Buna ziua,
Mai indraznesc sa cer o rezolvare / o solutie dinamica, privind coloanele ( anumite) ce nu contin nimic ( empty).
Adica din selectia L0107...L0612 ( numai din aceste coloane), sa fie indepartate coloanele care nu contin nimic ( in exemplu din fisier coloanele L0511 si L0612 sunt All Empty.Dar e posibil sa am , in alte prelucrari All empty in L0107 sau in oricare alta combinatie de coloane ).

Multumesc.
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

Catalin B.
Moderator
Moderator
Mesaje: 813
Membru din: Vin Sep 09, 2011 4:05 pm
Localitate: Iaşi

Re: PowerQueryIndeparteazaColoaneAllEmpty

Mesaj de Catalin B. » Mar Iul 14, 2020 4:04 pm

Interogarea urmatoare functioneaza pe exemplul dat:
let
Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
Clean = List.Accumulate(Table.ColumnNames(Source),Source,(state,current)=>if Text.StartsWith(current,"L") and List.NonNullCount(Table.ToColumns(Table.SelectColumns(Source,current)){0})=0 then Table.RemoveColumns(state ,current) else state)
in
Clean

Este un loop prin toate denumirile coloanelor, in traducere arata ca asa: "For each currentitem in Table.ColumnNames(Source), daca item incepe cu "L" si numarul de elemente NonNull este zero, atunci sterge coloana, altfel lasa tabelul neschimbat"
Source marcat cu rosu este seed (tabelul initial). Cu albastru este stadiul intermediar, care incepe cu seed (tabelul initial) si este transformat la fiecare iteratie daca valoarea current (numele coloanei din iteratia respectiva) corespunde conditiilor stabilite.

Un alt exemplu:
let
Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
ColumnListToRemove= List.Accumulate(Table.ColumnNames(Source),{},(state,current)=>if Text.StartsWith(current,"L") and List.NonNullCount(Table.ToColumns(Table.SelectColumns(Source,current)){0})=0 then state & {current} else state)
in
ColumnListToRemove
In acest exemplu, seed este o lista goala: {}. La fiecare iteratie, la lista de plecare {} adaugam numele coloanei care corespunde conditiilor: state & {current}
Deoarece am plecat de la o lista, si rezultatul final este o lista (lista coloanelor ce trebuie eliminate), si operatiunile din loop trebuie sa corespunda cu tipul de obiect de la care incepe iteratia.
Probleme să fie, că soluţii se găsesc...

Tzica
Mesaje: 639
Membru din: Sâm Aug 11, 2012 10:52 pm

Re: PowerQueryIndeparteazaColoaneAllEmpty

Mesaj de Tzica » Mie Iul 15, 2020 11:28 am

Multumesc.
Ca de obicei..raspunsuri amanuntite, si profesioniste.
In euforia mea referitor la automatizare ( deh..orice ..imbunatatire..genereaza noi probleme !), am omis in acest topic ( desi ar fi trebuit sa imi dau seama !!) ca e necesara si o adunare a respectivelor coloane ramase ( L0107..etc..).Nu de putine ori, totalurile din tabelul primit...sunt eronate...si fireste ca ce calculam eu in excel nu se pupa cu totalurile din fiserul primit. ( in fiserul meu..manual, adaugam o coloana de TotalEu, dupa care mai adaugam una pentru comparare valori, cu ajutorul "Value.Compare([Total1], [TotalEu]).
In fine, mai am rugamintea ..si pentru un total ( coloana cu total row) asupra coloanelor ramase.
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

Catalin B.
Moderator
Moderator
Mesaje: 813
Membru din: Vin Sep 09, 2011 4:05 pm
Localitate: Iaşi

Re: PowerQueryIndeparteazaColoaneAllEmpty

Mesaj de Catalin B. » Mie Iul 15, 2020 12:59 pm

Cod: Selectaţi tot

let
   Source = Excel.CurrentWorkbook(){[Name="tblPrimit"]}[Content],
    #"Clean" = List.Accumulate(Table.ColumnNames(Source),Source,(state,current)=>if Text.StartsWith(current,"L") and List.NonNullCount(Table.ToColumns(Table.SelectColumns(Source,current)){0})=0 then Table.RemoveColumns(state ,current) else state),
    #"Added Custom" = Table.AddColumn(Clean, "TotalEu", (x)=>List.Sum(Record.ToList(Record.SelectFields(x,List.Select(Table.ColumnNames(Clean),each Text.StartsWith(_,"L"))))))
in
    #"Added Custom"
(x)=> transforma randul curent in Record type. (x[NITP]="JUP ÂN IR DUMITRACHE TITIRCĂ", x[AnScolar]="2019 - 2020", s.a.m.d)
Deci in continuare, trebuie sa aplicam record functions pe x:
mai intai, pe lista de coloane pastram doar cele care incep cu L":
ListaCareIncepeCuL = List.Select(Table.ColumnNames(Clean),each Text.StartsWith(_,"L"))
Apoi, din randul curent (x record), pastram doar acele records la care field name incepe cu L:
Record.SelectFields(x,ListaCareIncepeCuL)
Ca sa poata fi adunate valorile, convertim record in list (se elimina astfel headerele si raman doar valorile)
Probleme să fie, că soluţii se găsesc...

Catalin B.
Moderator
Moderator
Mesaje: 813
Membru din: Vin Sep 09, 2011 4:05 pm
Localitate: Iaşi

Re: PowerQueryIndeparteazaColoaneAllEmpty

Mesaj de Catalin B. » Mie Iul 15, 2020 1:14 pm

Si totusi, nimic din cele de mai sus nu erau neaparat necesare...
Daca selectezi toate coloanele "fixe", Unpivot Other Columns este SINGURA operatie care trebuia facuta.
Unpivot elimina automat null entries, la nivel de null field, nu doar daca intreaga coloana e null...
De aici, un tabel pivot ar fi rezolvat toate problemele : report layout flexibil, sumele sunt calculate corect ;)
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.
Probleme să fie, că soluţii se găsesc...

Tzica
Mesaje: 639
Membru din: Sâm Aug 11, 2012 10:52 pm

Re: PowerQueryIndeparteazaColoaneAllEmpty

Mesaj de Tzica » Joi Iul 16, 2020 8:30 am

Multumesc pentru rabdare si intelegere.
La asemenea raspunsuri amanuntite, consumatoare de timp, ma simt dator sa dau citeva explicatii... eu in materie de VBA si / sau PQ, fiind precum un caine lup ( sau labrador !)..inteleg , dar nu pot sa ma exprim !

1.Excel.CurrentWorkbook. Multumesc..nu stiam ca se poate direct.Io..il plimbam..prin tot calculatorul conform..interfata;
2.Table2. Da..stiam ca e util sa fie preluat in PQ, din tabel..dar...am colegi pentru care orice insiruire de randuri / coloane ( fie cu spatii fie lipite!) inseamna tabel ( fie el..si raport ).In fine ... ideea este ca fac aceasta aplicatie sa o foloseasca si..altii..eu in doi trei ani sper sa ies la pensie;
3.Pivot / Unpivot.Da...am remarcat ca foarte multe raspunsuri / sugestii privind spete de genul "dinamically remove / select / rename etc.." se bazeaza pe tehnica respectiva.Dar...ca o continuare la punctul 2 ( plus lipsurile mele in materie de informatica avansata) ma determina, sa aleg calea de pas cu pas ( adica operatiuni care le faceeam in clasicul Excel gen text to columns etc..) pentru a identifica erorile din fisierul primit.Pivot / Unpivot..e ..prea abstract ( luciferic as zice !) pt persoane care nu au cunostinte....medii (sa zicem ca sa nu jignesc) de excel.

Multumesc, si.felicitari pentru activitatea depusa .

Catalin B.
Moderator
Moderator
Mesaje: 813
Membru din: Vin Sep 09, 2011 4:05 pm
Localitate: Iaşi

Re: PowerQueryIndeparteazaColoaneAllEmpty

Mesaj de Catalin B. » Joi Iul 16, 2020 9:04 am

Tzica scrie:
Joi Iul 16, 2020 8:30 am
ma determina, sa aleg calea de pas cu pas ( adica operatiuni care le faceeam in clasicul Excel gen text to columns etc..)
Chiar asta e una din problemele cele mai des intalnite in PQ: in PQ trebuie gandit altfel, aici nu mai exista row/cell context la fel ca in Excel, se lucreaza doar pe coloane intregi.
Se poate imita un row context cu Index column, dar asta duce la o incetinire vizibila a vitezei de procesare.
In ultimul mesaj am incercat sa aduc o alternativa care rezolva toate problemele mult mai simplu decat o solutie bazata pe o gandire "Excel", doar din interfata PQ, fara sa fie nevoie de functii complexe. Evident, tu stii cel mai bine ce trebuie pentru echipa, nu inseamna ca versiunea propusa e cea mai buna solutie.
La inceput, e greu de conceput un proces de transformare gandit din perspectiva PQ, majoritatea se straduie sa imite un proces facut manual in Excel pentru ca nu alte repere deocamdata.
Dar, incetul cu incetul, se schimba si modul de gandire :), incerc sa ajut cat pot.
Probleme să fie, că soluţii se găsesc...

Scrie răspuns

Înapoi la “Power Query & Power Pivot”