Saluti al gruppo,
vorrei semplificare il procedimento che ho seguito per "splittare" il contenuto di alcuni campi, avete qualche suggerimento?
Nel file allegato ho riportato la tabella di partenza ed il risultato atteso. Nel caso reale, la tabella di partenza è il risultato di una query autoreferenziale alla quale sono aggiunti tre campi note, due dei quali possono presentare per alcuni records dei valori corrispondenti come quelli rappresentati nei campi 4 e 5 della Tabella1 del file allegato, esempio:
A1|A2 ---> 5|10, oppure B1|B2|B3--->1|5|5 queste corrispondenze possono essere anche un numero indefinito superiore a 3, ma per ogni records tante sono nel campo 4 pari numero lo sono nel campo 5, e la corrispondenza è sempre primo con primo, secondo con secondo e così via.
SPLIT di due colonne con valori combinati correlati
Moderatore: Utilizzo_prof_Excel
-
- Messaggi: 16 | Topic creati
- Iscritto il: mar 14 lug 2020, 21:39
- Luogo: Lecce-Pisa
- Ringraziato: 5 volte
SPLIT di due colonne con valori combinati correlati
- Allegati
-
- GG1.xlsx
- (143.82 KiB) Scaricato 13 volte
-
- Messaggi: 2246 | Topic creati
- Iscritto il: dom 28 giu 2020, 19:41
- Luogo: Bologna
- Ringraziato: 672 volte
- Contatta:
SPLIT di due colonne con valori combinati correlati
Ciao ggratis,
Ti consiglio di evitare quel metodo di split di colonna, non genera delle query robuste:
Questo genera un codice hardcoded che fissa il numero di campi che verranno generati dallo split. Prova ad aggiungere in riga 7 (ID4) un'altra B (B4) ed aggiorna la query, vedrai che ti rimangono comunque 3 campi.
Prova invece questa soluzione, dovrebbe essere abbastanza lineare, anche se magari si può pulire meglio il codice.
A presto,
Andrea
Ti consiglio di evitare quel metodo di split di colonna, non genera delle query robuste:
Codice: Seleziona tutto
= Table.SplitColumn(#"Rimosse colonne", "CAMPO5", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), {"CAMPO5.1", "CAMPO5.2", "CAMPO5.3"})
Prova invece questa soluzione, dovrebbe essere abbastanza lineare, anche se magari si può pulire meglio il codice.
A presto,
Andrea
- Allegati
-
- GG1.xlsx
- (149.9 KiB) Scaricato 14 volte
-
Autore del topic - Messaggi: 16 | Topic creati
- Iscritto il: mar 14 lug 2020, 21:39
- Luogo: Lecce-Pisa
- Ringraziato: 5 volte
SPLIT di due colonne con valori combinati correlati
Si mi ero reso conto della cosa per questo avevo precisato che il numero di valori correlati poteva essere maggiore di 3 e imprecisato.
Grazie per la risposta, che andrò a leggere...
-
Autore del topic - Messaggi: 16 | Topic creati
- Iscritto il: mar 14 lug 2020, 21:39
- Luogo: Lecce-Pisa
- Ringraziato: 5 volte
SPLIT di due colonne con valori combinati correlati
...ecco, mi hai dato di che studiare per domani!
Codice: Seleziona tutto
#"Suddividi colonna in base al delimitatore" = Table.ExpandListColumn(Table.TransformColumns(#"Aggiunta colonna indice", {{"CAMPO4", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "CAMPO4"),
-
Autore del topic - Messaggi: 16 | Topic creati
- Iscritto il: mar 14 lug 2020, 21:39
- Luogo: Lecce-Pisa
- Ringraziato: 5 volte
SPLIT di due colonne con valori combinati correlati
Provando a fare tutto con un'unica query, scopiazzando un po' dalla rete, ho tirato fuori questi passaggi, ma c'è qualcosa che non va nel passaggio "Pivoted Column"...
...provando a fare la stessa cosa seguendo il tuo (Andrea90 ) procedimento ci sono riuscito!
con un paio di esercizi, non si può certo imparare il codice M, ma ora che me lo avete fatto conoscere, vi toccherà sopportarmi
Codice: Seleziona tutto
let
Source = Excel.CurrentWorkbook(){[Name="Tabella1"]}[Content],
#"Filtrate righe" = Table.SelectRows(Source, each Text.Contains([CAMPO4], "|")),
#"Removed Columns" = Table.RemoveColumns(#"Filtrate righe",{"CAMPO4"}),
#"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Removed Columns", {{"CAMPO5", Splitter.SplitTextByDelimiter("|", QuoteStyle.None), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "CAMPO5"),
CAMPO5 = Table.AddIndexColumn(#"Split Column by Delimiter", "Index", 1, 1),
#"Removed Columns1" = Table.RemoveColumns(#"Filtrate righe",{"CAMPO5"}),
#"Split Column by Delimiter2" = Table.ExpandListColumn(Table.TransformColumns(#"Removed Columns1", {{"CAMPO4", Splitter.SplitTextByDelimiter("|", QuoteStyle.None), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "CAMPO4"),
CAMPO4 = Table.AddIndexColumn(#"Split Column by Delimiter2", "Index", 1, 1),
#"Consolidated" = CAMPO5 & CAMPO4,
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(Consolidated, {"Index"}, "Attribute", "Value"),
#"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Unpivoted Other Columns", {{"Index", type text}}), List.Distinct(Table.TransformColumnTypes(#"Unpivoted Other Columns", {{"Index", type text}})[Index]), "Index", "Value"),
#"Transposed Table" = Table.Transpose(#"Pivoted Column"),
#"Promoted Headers" = Table.PromoteHeaders(#"Transposed Table", [PromoteAllScalars=true])
in
#"Promoted Headers"
Codice: Seleziona tutto
let
Origine = Excel.CurrentWorkbook(){[Name="Tabella1"]}[Content],
Tab0 = Table.TransformColumnTypes(Origine,{{"CAMPO1", type text}, {"CAMPO2", type number}, {"CAMPO3", type number}, {"CAMPO4", type text}, {"CAMPO5", type any}}),
Indice0 = Table.TransformColumnTypes( Table.AddIndexColumn(Tab0, "Indice", 1, 1),{{"Indice", Int64.Type}}),
SplitCampo4 = Table.ExpandListColumn(Table.TransformColumns(Indice0, {{"CAMPO4", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "CAMPO4"),
TipoCampo4 = Table.TransformColumnTypes(SplitCampo4,{{"CAMPO4", type text}}),
Indice1 = Table.TransformColumnTypes( Table.AddIndexColumn(TipoCampo4, "Indice.1", 1, 1),{{"Indice.1", Int64.Type}}),
TabCampo4 = Table.RemoveColumns(Indice1,{"CAMPO5"}),
SplitCampo5 = Table.ExpandListColumn(Table.TransformColumns(Table.TransformColumnTypes(Indice0, {{"CAMPO5", type text}}, "it-IT"), {{"CAMPO5", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "CAMPO5"),
TipoCampo5 = Table.TransformColumnTypes(SplitCampo5,{{"CAMPO5", Int64.Type}}),
TabCampo5 = Table.TransformColumnTypes(Table.AddIndexColumn(TipoCampo5, "Indice.1", 1, 1),{{"Indice.1", Int64.Type}}),
MergeTabCampo4TabCampo5 = Table.NestedJoin(TabCampo4,{"Indice", "Indice.1"},TabCampo5,{"Indice", "Indice.1"},"TabCampo5",JoinKind.LeftOuter),
TabCampo4TabCampo5ConIndici = Table.ExpandTableColumn(MergeTabCampo4TabCampo5, "TabCampo5", {"CAMPO5"}, {"CAMPO5"}),
Risultato = Table.RemoveColumns(TabCampo4TabCampo5ConIndici,{"Indice", "Indice.1"})
in
Risultato