PowerQueryIndeparteazaColoaneAllEmpty
PowerQueryIndeparteazaColoaneAllEmpty
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.
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.
-
- Moderator
- Mesaje: 813
- Membru din: Vin Sep 09, 2011 4:05 pm
- Localitate: Iaşi
Re: PowerQueryIndeparteazaColoaneAllEmpty
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.
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...
Re: PowerQueryIndeparteazaColoaneAllEmpty
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.
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.
-
- Moderator
- Mesaje: 813
- Membru din: Vin Sep 09, 2011 4:05 pm
- Localitate: Iaşi
Re: PowerQueryIndeparteazaColoaneAllEmpty
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"
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...
-
- Moderator
- Mesaje: 813
- Membru din: Vin Sep 09, 2011 4:05 pm
- Localitate: Iaşi
Re: PowerQueryIndeparteazaColoaneAllEmpty
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
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...
Re: PowerQueryIndeparteazaColoaneAllEmpty
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 .
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 .
-
- Moderator
- Mesaje: 813
- Membru din: Vin Sep 09, 2011 4:05 pm
- Localitate: Iaşi
Re: PowerQueryIndeparteazaColoaneAllEmpty
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...