Risolto PowerQuery: Accodare più colonne dallo stesso foglio

bacchett

Nuovo utente
4 Aprile 2018
11
1
Ticino
2016
0
Salve a tutti,
dovendo lavorare da casa ho più tempo per sistemare alcune procedure fatte in file excel.
In questo caso ho uno strumento di misura che controlla diverse batterie, poi le misure me le esporta in un file cvs.
Purtroppo il file é strutturato per colonne:
Batteria 1: colonna 1-3
Batteria 2: colonna 5-7
Batterie 3: colonna 9-11
così via fino alla batteria 32, con una colonna vuota tra i risultati di una batteria e l'altra.
Vorrei alla fine avere tutti i valori delle batterie in soli 4 colonne.
Arrivo a formattare tutte le colonne allo stesso modo, ma non riesco a spostare le colonne 5-7 (e 9-11 e le altre) sotto le colonne 1-3.
In excel con VBA sono riuscito a ottenere il risultato voluto, ma rimane lento e pesante (sono 16 file da leggere con almeno 2000 righe per 32 batterie)
Con PowerQuery sarebbe più leggero e veloce, spero.
Ma nei vari tutorial o blog non ho trovato (magari me lo sono perso) niente che possa aiutarmi.
In allegato il file con il risultato della mia PowerQuery (fino a dove sono riuscito ad arrivare) e come vorrei che fosse il risultato.
Vi ringrazio tutti per la pazienza.
Luca
 

Allegati

Enea

Utente abituale
3 Settembre 2019
859
45
Nord Milano
Excel 2010
92
ciao
devi creare 4 query per isolare i gruppi di dati
poi crei tre query con le quali incollonni le singole query
Io sono partito da una query di cartella C:\LettureBatterie
poi ho duplicato la query e fatto le necessarie modifiche (scelta delle colonne - rinominato i campi)

Visual Basic:
let
    Origine = Folder.Files("C:\LettureBatterie"),
    #"Filtrate righe" = Table.SelectRows(Origine, each true),
    #"Rimosse altre colonne" = Table.SelectColumns(#"Filtrate righe",{"Content"}),
    #"Richiama funzione personalizzata1" = Table.AddColumn(#"Rimosse altre colonne", "Trasforma file da LettureBatterie", each #"Trasforma file da LettureBatterie"([Content])),
    #"Rimosse altre colonne1" = Table.SelectColumns(#"Richiama funzione personalizzata1", {"Trasforma file da LettureBatterie"}),
    #"Espansa colonna table1" = Table.ExpandTableColumn(#"Rimosse altre colonne1", "Trasforma file da LettureBatterie", Table.ColumnNames(#"Trasforma file da LettureBatterie"(#"File di esempio"))),
    #"Rimosse altre colonne2" = Table.SelectColumns(#"Espansa colonna table1",{"Date and time", " Timestamp", "U min DAM#7.1"}),
    #"Aggiunta colonna personalizzata" = Table.AddColumn(#"Rimosse altre colonne2", "Personalizzato", each "7.1"),
    #"Rinominate colonne" = Table.RenameColumns(#"Aggiunta colonna personalizzata",{{"U min DAM#7.1", "U min DAM"}, {" Timestamp", "Timestamp"}})
in
    #"Rinominate colonne"

let
    Origine = Folder.Files("C:\LettureBatterie"),
    #"Filtrate righe" = Table.SelectRows(Origine, each true),
    #"Rimosse altre colonne" = Table.SelectColumns(#"Filtrate righe",{"Content"}),
    #"Richiama funzione personalizzata1" = Table.AddColumn(#"Rimosse altre colonne", "Trasforma file da LettureBatterie", each #"Trasforma file da LettureBatterie"([Content])),
    #"Rimosse altre colonne1" = Table.SelectColumns(#"Richiama funzione personalizzata1", {"Trasforma file da LettureBatterie"}),
    #"Tabella Trasforma file da LettureBatterie espansa" = Table.ExpandTableColumn(#"Rimosse altre colonne1", "Trasforma file da LettureBatterie", {"Date and time_1", " Timestamp_2", "U min DAM#7.2"}, {"Trasforma file da LettureBatterie.Date and time_1", "Trasforma file da LettureBatterie. Timestamp_2", "Trasforma file da LettureBatterie.U min DAM#7.2"}),
    #"Aggiunta colonna personalizzata" = Table.AddColumn(#"Tabella Trasforma file da LettureBatterie espansa", "Personalizzato", each "7.2"),
    #"Rinominate colonne" = Table.RenameColumns(#"Aggiunta colonna personalizzata",{{"Trasforma file da LettureBatterie. Timestamp_2", "Timestamp"}, {"Trasforma file da LettureBatterie.Date and time_1", "Date and time"}, {"Trasforma file da LettureBatterie.U min DAM#7.2", "U min DAM"}})
in
    #"Rinominate colonne"
 

Allegati

klingklang

Excel/Power BI Expert
Staff
20 Ottobre 2017
6.135
245
43
San Giovanni in Persiceto (BO)
www.mondobi.it
2016, 365
473
Ciao, guarda io te l'ho fatta con una sola query, ma è leggermente complessa da capire. Comunque l'unico passaggio manuale che devi fare (quando cambierà il numero di batterie) è andare a implementare l'elenco delle batterie nei passaggi di sostituzione valori e riempimento verso il basso (righe 16 e 17 del mio codice). Tutto il resto dovrebbe essere insensibile alla variazione del numero di colonne (spero).
Fammi sapere
M (Power Query):
// FormattazioneDatiBatterie
let
    Origine = Csv.Document(File.Contents("C:\Users\Enrico\OneDrive\ForumExcel\FileOriginale.csv"),[Delimiter=",", Columns=16, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    #"Trasposta colonna" = Table.Transpose(Origine),
    #"Suddividi colonna in base al delimitatore" = Table.SplitColumn(#"Trasposta colonna", "Column1", Splitter.SplitTextByEachDelimiter({"#"}, QuoteStyle.Csv, false), {"Column1.1", "Column1.2"}),
    #"Ricopiato in basso" = Table.FillDown(#"Suddividi colonna in base al delimitatore",{"Column1.2"}),
    #"Sostituito valore" = Table.ReplaceValue(#"Ricopiato in basso","","DAM",Replacer.ReplaceValue,{"Column1.1"}),
    #"Sostituito valore1" = Table.ReplaceValue(#"Sostituito valore","U min DAM","U min",Replacer.ReplaceText,{"Column1.1"}),
    #"Testo troncato" = Table.TransformColumns(#"Sostituito valore1",{{"Column1.1", Text.Trim, type text}}),
    #"Aggiunta colonna indice" = Table.AddIndexColumn(#"Testo troncato", "Indice", 0, 1, Int64.Type),
    #"Divisione intera colonna" = Table.TransformColumns(#"Aggiunta colonna indice", {{"Indice", each Number.IntegerDivide(_, 4), Int64.Type}}),
    #"Modificato tipo3" = Table.TransformColumnTypes(#"Divisione intera colonna",{{"Indice", type text}}),
    #"Merge di colonne" = Table.CombineColumns(#"Modificato tipo3",{"Indice", "Column1.1"},Combiner.CombineTextByDelimiter("---", QuoteStyle.None),"ID"),
    #"Trasposta colonna1" = Table.Transpose(#"Merge di colonne"),
    #"Intestazioni alzate di livello" = Table.PromoteHeaders(#"Trasposta colonna1", [PromoteAllScalars=true]),
    #"Sostituito valore2" = Table.ReplaceValue(#"Intestazioni alzate di livello","",null,Replacer.ReplaceValue,{"0---DAM", "1---DAM", "2---DAM", "3---DAM"}),
    #"Ricopiato in basso1" = Table.FillDown(#"Sostituito valore2",{"0---DAM", "1---DAM", "2---DAM", "3---DAM"}),
    #"Filtrate righe" = Table.SelectRows(#"Ricopiato in basso1", each [#"0---Date and time"] <> null),
    #"Aggiunta colonna indice1" = Table.AddIndexColumn(#"Filtrate righe", "Indice", 1, 1, Int64.Type),
    #"Trasformate altre colonne tramite UnPivot" = Table.UnpivotOtherColumns(#"Aggiunta colonna indice1", {"Indice"}, "Attributo", "Valore"),
    #"Suddividi colonna in base al delimitatore1" = Table.SplitColumn(#"Trasformate altre colonne tramite UnPivot", "Attributo", Splitter.SplitTextByEachDelimiter({"---"}, QuoteStyle.Csv, false), {"Attributo.1", "Attributo.2"}),
    #"Modificato tipo" = Table.TransformColumnTypes(#"Suddividi colonna in base al delimitatore1",{{"Attributo.2", type text}, {"Attributo.1", Int64.Type}}),
    #"Colonna trasformata tramite Pivot" = Table.Pivot(#"Modificato tipo", List.Distinct(#"Modificato tipo"[Attributo.2]), "Attributo.2", "Valore"),
    #"Rimosse colonne" = Table.RemoveColumns(#"Colonna trasformata tramite Pivot",{"Attributo.1", "Indice"}),
    #"Modificato tipo1" = Table.TransformColumnTypes(#"Rimosse colonne",{{"DAM", type text}}),
    #"Modificato tipo con impostazioni locali" = Table.TransformColumnTypes(#"Modificato tipo1", {{"U min", type number}}, "en-US"),
    #"Modificato tipo2" = Table.TransformColumnTypes(#"Modificato tipo con impostazioni locali",{{"Timestamp", Int64.Type}, {"Date and time", type text}}),
    #"Ordinate righe" = Table.Sort(#"Modificato tipo2",{{"DAM", Order.Ascending}, {"Timestamp", Order.Ascending}}),
    #"Rinominate colonne" = Table.RenameColumns(#"Ordinate righe",{{"U min", "U min DAM"}, {"DAM", "Batteria"}})
in
    #"Rinominate colonne"
 

Allegati

  • Like
Reactions: Enea and Rubik72

bacchett

Nuovo utente
4 Aprile 2018
11
1
Ticino
2016
0
ciao
devi creare 4 query per isolare i gruppi di dati
poi crei tre query con le quali incollonni le singole query
Io sono partito da una query di cartella C:\LettureBatterie
poi ho duplicato la query e fatto le necessarie modifiche (scelta delle colonne - rinominato i campi)

Visual Basic:
let
...
Ciao Enea,
ti ringrazio molto per la tua risposta, funziona avendo pochi gruppi di colonne da spostare. Io ho 32 batterie alla fine dovrei creare 32 query per riuscire a spostare il tutto.
 
Ultima modifica:

bacchett

Nuovo utente
4 Aprile 2018
11
1
Ticino
2016
0
Ciao, guarda io te l'ho fatta con una sola query, ma è leggermente complessa da capire. Comunque l'unico passaggio manuale che devi fare (quando cambierà il numero di batterie) è andare a implementare l'elenco delle batterie nei passaggi di sostituzione valori e riempimento verso il basso (righe 16 e 17 del mio codice). Tutto il resto dovrebbe essere insensibile alla variazione del numero di colonne (spero).
Fammi sapere
....
Ciao klingklang,
la tua é perfetta, ho seguito passo a passo la tua procedura ed sono riuscito a farlo per tutte e 32 batterie.

Che versione di excel utilizzi? all'apertura di PowerQuery mi ha dato un avvertimento che era stata fatta con una versione superiore e mi dava un errore quando arrivavo al
Table.AddIndexColumn(#"Testo troncato", "Indice", 0, 1, Int64.Type)
la mia accetta solo 4 argomenti, per cui.
Table.AddIndexColumn(#"Testo troncato", "Indice", 0, 1)

Per il resto ha funzionato molto bene.
Grazie tante, sei un genio....
Ringrazio tutti per l'aiuto.
Luca
 
  • Like
Reactions: Enea

klingklang

Excel/Power BI Expert
Staff
20 Ottobre 2017
6.135
245
43
San Giovanni in Persiceto (BO)
www.mondobi.it
2016, 365
473
Ciao klingklang,
la tua é perfetta, ho seguito passo a passo la tua procedura ed sono riuscito a farlo per tutte e 32 batterie.

Che versione di excel utilizzi? all'apertura di PowerQuery mi ha dato un avvertimento che era stata fatta con una versione superiore e mi dava un errore quando arrivavo al
Table.AddIndexColumn(#"Testo troncato", "Indice", 0, 1, Int64.Type)
la mia accetta solo 4 argomenti, per cui.
Table.AddIndexColumn(#"Testo troncato", "Indice", 0, 1)

Per il resto ha funzionato molto bene.
Grazie tante, sei un genio....
Ringrazio tutti per l'aiuto.
Luca
Ciao e grazie per il riscontro positivo. Uso excel 365, non mi ero neanche accorto che accettasse il quarto parametro: quando la scrivo io ne metto sempre solo tre! Bravo tu ad avere aggiustato 👍
 

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!