Forum Discussion
danielbacher
2 years agoFrequent Visitor
Transposing data from excel
I have a problem with a very difficult dataset. This dataset has year written over 4 columns and all the values are therefore written after as four different columns. (See Screenshot) "Nyeste år" = ...
dufoq3
1 year agoCommunity Champion
Make the link public
danielbacher
1 year agoFrequent Visitor
Here we go
- dufoq31 year agoCommunity Champion
Try this:
let Source = Excel.Workbook(File.Contents("C:\Users\Downloads\PowerQueryForum\danielbacher\Example file.xlsx"), null, true), #"Sample Data_Sheet" = Source{[Item="Sample Data",Kind="Sheet"]}[Data], KeptFirstRows = Table.FirstN(#"Sample Data_Sheet", each [Column1] <> "Expected Result"), RemovedBlankRows = Table.SelectRows(KeptFirstRows, each not List.IsEmpty(List.RemoveMatchingItems(Record.FieldValues(_), {"", null, "Data Sample"}))), PromotedHeaders = Table.PromoteHeaders(RemovedBlankRows, [PromoteAllScalars=true]), RemovedBlankColumns = List.Accumulate(Table.ColumnNames(PromotedHeaders), PromotedHeaders, (s,c)=> if List.IsEmpty(List.RemoveNulls(Table.Column(s, c))) then Table.RemoveColumns(s, c) else s), StepBack = RemovedBlankColumns, #"Demoted Headers" = Table.DemoteHeaders(StepBack), TransposedTable = Table.Transpose(#"Demoted Headers"), MergedColumns = Table.CombineColumns(Table.TransformColumnTypes(TransposedTable, {{"Column2", type text}}, "sk-SK"),{"Column1", "Column2"},Combiner.CombineTextByDelimiter("||", QuoteStyle.None),"Merged"), TransposedTable1 = Table.Transpose(MergedColumns), PromotedHeaders1 = Table.PromoteHeaders(TransposedTable1, [PromoteAllScalars=true]), AddedIndex = Table.AddIndexColumn(PromotedHeaders1, "Index", 0, 1, Int64.Type), UnpivotedOtherColumns = Table.UnpivotOtherColumns(AddedIndex, List.Select(Table.ColumnNames(AddedIndex), each not List.Contains({"-3", "-2", "-1", "Nyeste år"}, _, (x,y)=> Text.EndsWith(y, x))), "Attribute", "Value"), SplitColumnByDelimiter = Table.SplitColumn(UnpivotedOtherColumns, "Attribute", Splitter.SplitTextByDelimiter("||", QuoteStyle.Csv), {"Attribute", "Year"}), ExtractedTextBeforeDelimiter = Table.TransformColumns(SplitColumnByDelimiter, {{"Attribute", each if Text.Contains(_, "_") then Text.BeforeDelimiter(_, "_", {0, RelativePosition.FromEnd}) else _, type text}}), ReplacedValue = Table.ReplaceValue(ExtractedTextBeforeDelimiter,"N/A",null,Replacer.ReplaceValue,{"Value"}), PivotedColumn = Table.Pivot(ReplacedValue, List.Distinct(ReplacedValue[Attribute]), "Attribute", "Value"), ReplacedValue1 = Table.ReplaceValue(PivotedColumn,"Nyeste år","0",Replacer.ReplaceText,{"Year"}), ChangedType = Table.TransformColumnTypes(ReplacedValue1,{{"Year", Int64.Type}}), SortedRows = Table.Sort(ChangedType,{{"Index", Order.Ascending}, {"Year", Order.Ascending}}), RemovedColumns = Table.RemoveColumns(SortedRows,{"Index", "Year"}), RenamedColumns = Table.TransformColumnNames(RemovedColumns, each Text.Remove(_, "|")), // Set only number or text type ChangedTypeDynamic = List.Accumulate(Table.ColumnNames(RenamedColumns), RenamedColumns, (s,c)=> if List.AllTrue(List.Transform(List.RemoveNulls(Table.Column(s, c)), (x)=> try (Number.From(x, "en-US") is number) otherwise false)) then Table.TransformColumnTypes(s,{{c, type number}}, "en-US") else Table.TransformColumnTypes(s,{{c, type text}}) ) in ChangedTypeDynamic