Forum Discussion

Daniel_L's avatar
Daniel_L
Frequent Visitor
2 years ago
Solved

Import complex CSV file

Hello,   Help needed... I have a quite messy complex CSV file that I'm trying to import to Power BI. I guess some pivoting/unpivoting and fill commands are needed, but I don't know how to get it do...
  • dufoq3's avatar
    2 years ago

    Hi Daniel_L, different approach here.

     

    In your expected result - there is a mistake in my opinion. This one should be correct:

    Result

     

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("jVZbb5swFP4rKM9R5dvxZW8kI6k2TZHSTnuo+sAy1KJ2ZCKkU/frd+zYQGuMqgh8IHznO3f77m6xqZuyOdTlc1YeDsdz0y2WC6GUVrju2odshWv27hKU4Ad0cb+8W3wr6wahXf1Sd6/+/+uq/JUd2wcU8/WVsqooXn8OJ7wzBYRw7j61CvbV6XhuD5XH4mNGWSDqUUAslBAHuTn/fE+ZN80ZfTgcT93Jv7KUr1XZWrQyggJz7MJoZH+v5lOgXJddlq/W/on1BgjOiQEUlGFEQdJ0L0MPpAJ/DkjUDFCIkdkXpMZAkX6dtfhzsYkt1owYqw09FkokiSEE2wpPNmlSG8vLKSFAkjgdGUy1FkwMwqzJxWYbxYoZLhhfWhWaAdAUdx6qklojfltbpZWkZEk/931VjQwWrijckoSFlPLBTAYuMdKWchJIeOAD8Fa6EEvjq2AyNLfV6bmMDBUgsOwGIcVpzIeg00l5rF5CO41SIiglNrbAuAKdYg6+DuXHJMW2uwBpGshCeAXxQXLNIucrvs1YREiNIUwtLZobTSDZamaichUB191eSCBv4yb9ILIo4sFAubJhA6klJGdpeOcifHNz5QbhiJ6D0vziUGI04iuL3+9DyPhbE1yrC0ZEsqzChGCx1xzLwySB29Dib4aavyfTG2Y5DonVCO9nuZFGkn5NEFdtF5y13/6tqidLzhlnb6AT4bJwS72NqSmxJa1HUtKHoOU61gLMUCrmlIRm2nWPVZu1VdjR5BB/abgbQWMdE3H48jVKHe5jl+Elyczw2gfcqKH9dgR2TSN/BI+HzZtpAOXa0gRbp44dGBVlQfbYkS8mjh1Yc5QkOwVhZVP/K7v62Dj8enXlzhmjWXjRMNMsOXbKbheiNspaDx1ZMZl532558GAUQEKNZk4FNzK1UbnHjMWbFReaUjkIs3AewQG027Iva7r50PaiuN0XkfnGTStqxCT196buMgAZzRgAV+u4NSdhlLN4/6DCndc0xun+Pw==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Category = _t, Account = _t, Text = _t, Code = _t, Amount = _t, Unit = _t, #"Price per unit" = _t, Total = _t]),
        ReplaceBlankToNull = Table.TransformColumns(Source, {}, each if _ is text and Text.Trim(_) = "" then null else _),
        FilledDown = Table.FillDown(ReplaceBlankToNull,{"Account", "Code"}),
        FilteredRows = Table.SelectRows(FilledDown, each not List.Contains({null, "Financial account"}, [Category])),
        Categories = List.Buffer(List.Distinct(List.Select(FilteredRows[Category], each _ <> "Resource"))),
        Ad_Columns = List.Accumulate(
            Categories,
            FilteredRows,
            (s,c)=> Table.AddColumn(s, c, each if List.Contains({c, "Main activity"}, [Category]) then [Text] else null, type text) ),
        FilledDown2 = Table.FillDown(Ad_Columns, Categories),
        FilteredRows2 = Table.SelectRows(FilledDown2, each ([Category] = "Resource")),
        ReplaceValues = Table.ReplaceValue(FilteredRows2,
            each [Main activity],
            each null,
            (x,y,z)=> if x = y then z else x,
            List.Skip(Categories) ),
        RestoreTypes = Value.ReplaceType(ReplaceValues, Value.Type(FilteredRows2)),
        RemovedColumns = Table.RemoveColumns(RestoreTypes,{"Category", "Total"}),
        RenamedColumns = Table.RenameColumns(RemovedColumns,{{"Account", "Financial account"}, {"Text", "Resource"}}),
        ReorderedColumnsDynamic = Table.ReorderColumns(RenamedColumns,{"Financial account", "Code"} & Categories & {"Resource", "Amount", "Unit", "Price per unit"}),
        ChangedType = Table.TransformColumnTypes(ReorderedColumnsDynamic,{{"Financial account", Int64.Type}, {"Code", type text}, {"Resource", type text}, {"Amount", type number}, {"Unit", type text}, {"Price per unit", Currency.Type}})
    in
        ChangedType