Pagina 1 di 1

SPLIT di due colonne con valori combinati correlati

Inviato: sab 13 feb 2021, 19:08
da ggratis
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.
:wave:

SPLIT di due colonne con valori combinati correlati

Inviato: sab 13 feb 2021, 20:21
da Andrea90
Ciao ggratis,

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"})
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

SPLIT di due colonne con valori combinati correlati

Inviato: sab 13 feb 2021, 20:40
da ggratis
Andrea90 ha scritto: sab 13 feb 2021, 20:21 Ciao ggratis,
Ti consiglio di evitare quel metodo di split di colonna, non genera delle query robuste:
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... :wave:

SPLIT di due colonne con valori combinati correlati

Inviato: sab 13 feb 2021, 21:58
da ggratis
...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"),
:crazy:
:wave:

SPLIT di due colonne con valori combinati correlati

Inviato: dom 14 feb 2021, 17:52
da ggratis
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"... :cry:

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"
...provando a fare la stessa cosa seguendo il tuo (Andrea90 ) procedimento ci sono riuscito! :clap:

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
con un paio di esercizi, non si può certo imparare il codice M, ma ora che me lo avete fatto conoscere, vi toccherà sopportarmi ;)
:wave: