Forum Discussion

garycarters's avatar
garycarters
Helper I
7 years ago
Solved

Splitting multi-element data structure list into separate rows

Hi all

 

I have a table that contains a number of control records.  Each control record can dictate the behaviour of an aspect of our system and may be a string, flag, file name or a list of data.  My question relates to records defining lists of data.

 

The data lists comprise a prefix ("List:") followed by a list of indexes and descriptions.  For example;

List:"1","Description 1", "1","Description 1", "2","Description 2", "3","Description 3", etc

 

I want to access those descriptions based on the index used by the customer record - each customer is attached to an index on the customer record.

 

How can I split the list into a table of index, description?  I've tried using Split Column by delimiter which kind of works but gives a row in the output for each element;

1

Description 1

2

Description 2

3

Description 3

etc

 

I just want

1        Description 1

2        Description 2

3        Description 3

etc

 

I can then join the customer index to the description index.

 

TIA

  • Mariusz's avatar
    Mariusz
    7 years ago

    Hi garycarters 

     

    1. Create new Source >> Blank Query 

    2. Go to Advanced Editor and paste the Function Code Provided.

    3. In your table, go to Add Column ribbon and find Invoke Custom Function 

    4. In the Function Query section select the function you have created (most probably Query1 if you have not change the name ).

    5. In Your Column Section change ABC to Column Name and Select ListData from the drop down list next press OK to confirm.

    6. Now you should have an extra column in your table that can be expanded by:

    • Clicking inside the cell on "Table" 
    • If you want to expand on the original table, click on the double arrow on the column header and select the columns you want to add
    Best Regards,
    Mariusz

    Please feel free to connect with me.
    Mariusz Repczynski

      

     

11 Replies

  • Mariusz's avatar
    Mariusz
    Community Champion

    Hi garycarters 

     

    You can use the below M syntax 

    let
        Source = {"1","Description 1", "1","Description 1", "2","Description 2", "3","Description 3"},
        Split = List.Split( Source,  2 ), 
        Output = #table( type table [ ID = Int64.Type, Description = text ], Split )
    in
        Output

    Regards,
    Mariusz

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

    • garycarters's avatar
      garycarters
      Helper I

      Hi Mariusz

       

      Thanks for that, it looks promising.

       

      I've entered the code as below.  However, 

      = let
          Source = Sql.Database("calsql", "mcsrm_live"),
          dbo_spec_checklist_items = Source{[Schema="dbo",Item="spec_checklist_items"]}[Data],
          #"Filtered Rows" = Table.SelectRows(dbo_spec_checklist_items, each ([id] = 57)),
          #"Extracted Text Range" = Table.TransformColumns(#"Filtered Rows", {{"ListData", each Text.Middle(_, 5, 200000), type text}}),
          Split = List.Split( "Extracted Text Range", 2 ),
          Output = #table( type table [ ID = Int64.Type, Description = text ], Split )
      in
          #"Extracted Text Range"

      However, when I preview the results it's still only showing a single record.  

       

      I'm obviously missing something simple...

       

      • Mariusz's avatar
        Mariusz
        Community Champion

        Hi garycarters 

        My bad I think I missed couple of steps  

        let
            Source = " List:""1"",""Description 1"", ""1"",""Description 1"", ""2"",""Description 2"", ""3"",""Description 3""",
            #"Text Clean1" = Text.Replace(Source, """", ""),
            #"Text Clean2" = Text.Replace( #"Text Clean1", "List:", ""),
            #"Text Split" = Text.Split( #"Text Clean2", "," ),
            #"List Split" = List.Split( #"Text Split", 2 ),
            #"List to Table" = #table( type table [ ID = Int64.Type, Description = text ], #"List Split" ),
            #"Changed Type" = Table.TransformColumnTypes(#"List to Table",{{"ID", Int64.Type}})
        in
            #"Changed Type"

        Regards,
        Mariusz

        If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.