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" = ...
danielbacher
1 year agoFrequent Visitor
Here we go
dufoq3
1 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